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


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

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

3 8

3 ответа:

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

Это зависит.

    Глобальные переменные, определенные в основном исполняемом файле, останутся на том же адресе (если только исполняемый файл не построен с флагами -fpie и не связан с флагами -pie).
  1. глобальные переменные, определенные в других общих библиотеках, могут иметь резко отличающиеся адреса из-за ASLR .
  2. локальные переменные и параметры могут перемещаться на несколько K-байт из-за ASLR.
  3. переменные, выделенные в куче, также могут резко перемещаться из-за ASLR, или если ваша программа многопоточна.
Обратите внимание, что GDB в Linux по умолчанию отключает ASLR, чтобы упростить отладку. Вы можете повторно включить ASLR под GDB с помощью set disable-randomization off. Это может позволить вам воспроизвести проблему под GDB.

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

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

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

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

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

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