Погружение в технику и философию gdb Крис Касперски Хакер, номер #093, стр. 093-122-2 Обычно первым (разумным) действием после загрузки является установка брейкпоинта на функцию main (главную функцию языка Си) или _start – точку входа в программу, что осуществляется командой "tb адрес/имя", устанавливающей "одноразовую" точку останова, после чего можно смело запускать программу командой "run" (или "r"), зная, что отладчик "всплывет" в заданном месте. # gdb -q gdb-demo (gdb) tb main Breakpoint 1 at 0x8048473 (gdb) r Starting program: /home/kpnc/gdb/gdb-demo 0x08048473 in main () [загрузка исполняемых файлов без символьной информации] Если символьная информация отсутствует (например, была отрезана утилитой strip, как очень часто и бывает), то установка точек останова на _start/main становится невозможной, и мы должны указать отладчику "физический" адрес точки входа, который можно получить, например, при помощи утилиты objdump, запущенной с ключом '-f': # strip gdb-demo # objdump -f gdb-demo gdb-demo: O : i386, EXEC_P, HAS_SYMS, D_PAGED архитектура: i386, флаги 0x00000112: EXEC_P, HAS_SYMS, D_PAGED начальный адрес 0x08048300 Здесь установка точки останова на main проваливается, так как символьной информации нет. Отладчик предлагает установить ее позднее, но мы от этой идеи отказываемся, поскольку такой символ не станет доступен никогда. # gdb -q gdb-demo (no debugging symbols found)... (gdb) b main Function "main" not defined. Make breakpoint pending on future shared library load? (y or [n]) n А вот установка брейкпоинта по непосредственному адресу проходит успешно: (gdb) tb *0x8048300 Breakpoint 1 at 0x8048300 (gdb) r Starting program: /home/kpnc/gdb/gdb-demo (no debugging symbols found)... 0x08048300 in ?? () [подключение к уже запущенному процессу] Если процесс, который необходимо отлаживать, уже запущен, к нему можно подключиться, указав его идентификатор вместе с ключом '-pid' в командной строке, либо воспользовавшись командой "attach идентификатор", непосредственно из самого отладчика. Отсоединиться от процесса можно либо командой "detach" (запущенной без аргументов) или же выходом из отладчика по команде "quit" (или "q"). После отсоединения процесс продолжает свою работу в нормальном режиме, а если его необходимо завершить, то на помощь приходит команда "kill", убивающая текущий отлаживаемый процесс. Далее приведу пример сеанса работы. Запрашиваем PID подопытной программы: # ps -a | grep gdb_demo PID TTY TIME CMD 8189 pts/7 00:00:00 gdb_demo Подключаемся к уже запущенному процессу через командную строку: # gdb -q -pid 8189 Attaching to process 8189 Reading symbols from /home/kpnc/gdb/gdb_demo...done. Reading symbols from /lib/libc.so.6...done. Reading symbols from /lib/ld-linux.so.2...done. 0x400f2ab8 in read () from /lib/libc.so.6 (gdb) Вот так можно подключиться к уже запущенному процессу командной "attach": # gdb -q (gdb) attach 8189 Attaching to process 8189 (gdb) [загрузка программ с потрепанными заголовками] Если заголовок elf-файла умышленно искажен (смотри статью "Капитуляция защитных механизмов", опубликованную в январском "Хакере" за 2006 год), то gdb наотрез откажется его загружать. Пример такого файла можно найти на: www.crackmes.de/users/yanisto/tiny_crackme/. |