Разница между адресами GDB и "реальными" адресами?

Если я запускаю программу на C/C++ в gdb (после компиляции с флагом -g) и проверяю адреса определенных переменных, аргументов... и т. Д., А затем запускаю ее вне gdb (используя ./) будут ли эти адреса такими же, как те, что я видел в gdb? Если они разные, они обычно похожи или они будут кардинально отличаться?

Я спрашиваю об этом, потому что у меня есть программа переполнения буфера, которая отлично работает в GDB (с и без точек останова), однако, когда я пытаюсь запустить его вне GDB, это не работает.

3 ответа

Решение

Я проверяю адреса определенных переменных, аргументов... и т. Д., А затем запускаю его вне gdb (используя./), будут ли эти адреса такими же, как те, которые я видел в gdb

Это зависит.

  1. Глобальные переменные, определенные в главном исполняемом файле, останутся с тем же адресом (если только исполняемый файл не создан с -fpie и связано с -pie флаги.
  2. Глобальные переменные, определенные в других общих библиотеках, могут иметь совершенно разные адреса из-за ASLR.
  3. Локальные переменные и параметры могут перемещаться на несколько килобайт из-за ASLR.
  4. Переменные, выделенные в куче, также могут резко измениться из-за ASLR или если ваша программа многопоточная.

Обратите внимание, что GDB в Linux по умолчанию отключает ASLR, чтобы упростить отладку. Вы можете повторно включить ASLR под GDB с set disable-randomization off, Это может позволить вам воспроизвести проблему под GDB.

У меня переполнение буфера

Также обратите внимание, что такие инструменты, как Valgrind и Address Sanitizer, часто значительно более эффективны для обнаружения переполнения буфера, чем при работе в GDB. Address Sanitizer особенно хорош тем, что обнаруживает переполнение буфера в глобальных и стековых файлах (Valgrind этого не делает).

Вы никогда не должны предполагать, что определенный код или переменные будут расположены в фиксированном месте.

Это было верно в прошлом для большинства ОС, но это дыра в безопасности. Вредоносное ПО использует это для взлома программ. ОС будет склонна к шифрованию адресов для повышения безопасности.

Компиляция с -g Флаг увеличивает размер кода, так как он встраивается в исполняемую дополнительную информацию.

Что касается вашей проблемы с буфером, это поможет опубликовать фрагмент кода, где все идет не так, как надо.

Другие вопросы по тегам