Разница между адресами GDB и "реальными" адресами?
Если я запускаю программу на C/C++ в gdb (после компиляции с флагом -g) и проверяю адреса определенных переменных, аргументов... и т. Д., А затем запускаю ее вне gdb (используя ./
) будут ли эти адреса такими же, как те, что я видел в gdb? Если они разные, они обычно похожи или они будут кардинально отличаться?
Я спрашиваю об этом, потому что у меня есть программа переполнения буфера, которая отлично работает в GDB (с и без точек останова), однако, когда я пытаюсь запустить его вне GDB, это не работает.
3 ответа
Я проверяю адреса определенных переменных, аргументов... и т. Д., А затем запускаю его вне gdb (используя./), будут ли эти адреса такими же, как те, которые я видел в gdb
Это зависит.
- Глобальные переменные, определенные в главном исполняемом файле, останутся с тем же адресом (если только исполняемый файл не создан с
-fpie
и связано с-pie
флаги. - Глобальные переменные, определенные в других общих библиотеках, могут иметь совершенно разные адреса из-за ASLR.
- Локальные переменные и параметры могут перемещаться на несколько килобайт из-за ASLR.
- Переменные, выделенные в куче, также могут резко измениться из-за ASLR или если ваша программа многопоточная.
Обратите внимание, что GDB в Linux по умолчанию отключает ASLR, чтобы упростить отладку. Вы можете повторно включить ASLR под GDB с set disable-randomization off
, Это может позволить вам воспроизвести проблему под GDB.
У меня переполнение буфера
Также обратите внимание, что такие инструменты, как Valgrind и Address Sanitizer, часто значительно более эффективны для обнаружения переполнения буфера, чем при работе в GDB. Address Sanitizer особенно хорош тем, что обнаруживает переполнение буфера в глобальных и стековых файлах (Valgrind этого не делает).
Вы никогда не должны предполагать, что определенный код или переменные будут расположены в фиксированном месте.
Это было верно в прошлом для большинства ОС, но это дыра в безопасности. Вредоносное ПО использует это для взлома программ. ОС будет склонна к шифрованию адресов для повышения безопасности.
Компиляция с -g
Флаг увеличивает размер кода, так как он встраивается в исполняемую дополнительную информацию.
Что касается вашей проблемы с буфером, это поможет опубликовать фрагмент кода, где все идет не так, как надо.