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