Как найти адрес строки в памяти, используя GDB? - PullRequest
9 голосов
/ 10 июля 2011

Я хочу найти адрес строки в памяти. В этом случае я ищу "/ bin / sh". Это инициализированная переменная, поэтому она находится в разделе .data и после компиляции имеет фиксированный адрес. Так что мне делать в GDB, чтобы узнать его адрес памяти? И я не знаю имя переменной, в которой она хранится.

Ответы [ 3 ]

12 голосов
/ 14 сентября 2017

Использование info proc map звучит как лучший подход ко мне.

(gdb) info proc map
process 930
Mapped address spaces:

      Start Addr           End Addr       Size     Offset objfile
        0x400000           0x401000     0x1000        0x0 /myapp
        0x600000           0x601000     0x1000        0x0 /myapp
        0x601000           0x602000     0x1000     0x1000 /myapp
  0x7ffff7a1c000     0x7ffff7bd2000   0x1b6000        0x0 /usr/lib64/libc-2.17.so
  0x7ffff7bd2000     0x7ffff7dd2000   0x200000   0x1b6000 /usr/lib64/libc-2.17.so
  0x7ffff7dd2000     0x7ffff7dd6000     0x4000   0x1b6000 /usr/lib64/libc-2.17.so
  0x7ffff7dd6000     0x7ffff7dd8000     0x2000   0x1ba000 /usr/lib64/libc-2.17.so

(gdb) find 0x7ffff7a1c000,0x7ffff7bd2000,"/bin/sh"
0x7ffff7b98489
1 pattern found.
(gdb) x /s 0x7ffff7b98489
0x7ffff7b98489: "/bin/sh"
(gdb) x /xg 0x7ffff7b98489
0x7ffff7b98489: 0x0068732f6e69622f
9 голосов
/ 11 июля 2016

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

, например, если cat /proc/$PID/maps показывает, что виртуальная память вашего процесса находится в диапазоне от 0x08048000 до 0xc0000000, который вы можете искать следующим образом:

(gdb) find 0x80048000, 0xc0000000, "/bin/sh"

Другой способ получить отображение памяти вашего процесса - использовать встроенную команду GDB:

(gdb) info proc map
9 голосов
/ 10 июля 2011

Используйте команду find .

find [/sn] start_addr, +len, val1 [, val2, …]
find [/sn] start_addr, end_addr, val1 [, val2, …]

Поиск в памяти последовательности байтов, указанных в val1, val2 и т. Д. Поиск начинается с адреса start_addr и продолжается для любого байтов или до end_addr включительно. s и n являются необязательными параметрами. Они могут быть указаны в любом порядок, отдельно или вместе.

s, размер поискового запроса Размер каждого значения поискового запроса.

байт

h полуслов (два байта)

ш слова (четыре байта)

г гигантских слов (восемь байт)

Все значения интерпретируются на текущем языке. Это означает, что для Например, если текущий исходный язык - C / C ++, то поиск для строки «привет» включает завершающий символ «\ 0».

Если размер значения не указан, он берется из типа значения на текущем языке. Это полезно, когда нужно указать шаблон поиска как смесь типов. Обратите внимание, что это означает, что для Например, что в случае C-подобных языков поиск нетипизированных 0x42 будет искать «(int) 0x42», что обычно составляет четыре байта.

n, максимальное количество находок Максимальное количество совпадений для печати. по умолчанию печатаются все находки.

Вы можете использовать строки в качестве значений поиска. Цитируйте их двойными кавычками ("). Строковое значение копируется в байт шаблона поиска, независимо от порядкового номера цели и спецификации размера.

печатается адрес каждого найденного совпадения, а также счетчик найдено совпадений.

Адрес последнего найденного значения сохраняется в вспомогательной переменной «$ _». Подсчет количества совпадений хранится в «$ numfound».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...