перевести адреса среды выполнения в GDB

#debugging #memory #gdb #mapping

#отладка #память #gdb #отображение

Вопрос:

Когда я запускаю процесс с помощью GDB, а процесс не выполняется, я всегда получаю один и тот же адрес для одной и той же функции. Однако, когда я запускаю процесс, я каждый раз получаю другой адрес. Как я могу сравнить адреса из 2 запусков одного и того же процесса? ( двоичный файл не содержит отладочных символов )

Комментарии:

1. При запуске под управлением gdb aslr по умолчанию отключен. Когда вы запускаете без, aslr включен. Поэтому вы каждый раз получаете разные адреса.

Ответ №1:

при запуске процесса происходит динамическое сопоставление памяти, которое может изменяться при каждом запуске процесса. чтобы посмотреть его, просто используйте команду gdb : «отображение info proc» другой способ увидеть отображение памяти-это команда bash «pmap».

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

небольшой пример:

вывод сопоставления выглядит следующим образом :

 *Start Addr End Addr Size Offset objfile  0x563d17d8c000 0x563d17fd2000 0x246000 0x0 /opt/redislabs/bin/dmcproxy  0x563d181d2000 0x563d181d8000 0x6000 0x246000 /opt/redislabs/bin/dmcproxy  0x563d181d8000 0x563d181ee000 0x16000 0x24c000 /opt/redislabs/bin/dmcproxy*  

вы получаете адрес 0x0000563d17ed13fa во время выполнения. чтобы перевести его в адрес программы , вам следует уменьшить его начальный адрес, начальный адрес равен 0x563d17fd2000, поэтому результирующий адрес равен 0x1453fa

—gt; это адрес , который у вас есть в двоичном коде, если это адрес функции, вы можете увидеть его с помощью objdump или запустив gdb без запуска программы.

если двоичный файл, который вы запускаете, удален, и у вас есть незаписанная версия того же двоичного файла на другой машине, теперь вы можете использовать вычисленный адрес, чтобы просмотреть подробную информацию об адресе, который вы нашли, запустив gdb на незаписанном двоичном файле ( без запуска процесса ) и использовать: «информационный символ 0x1453fa», он будет работать, даже если вы находитесь в середине функции ( обратите внимание, что обратные пути дадут вам обратный адрес, а не адрес функции, который обычно отличается).