Покорение вершин отладки Крис Касперски Хакер, номер #095, стр. 095-118-4 Команды enable и disable используются для временного включения/выключения точек наблюдения/останова и имеют тот же самый синтаксис, что и delete. Работа с памятью и регистрами Дамп памяти для хакеров — это святое. Без него не обходится ни один взлом. Просматривать/модифицировать память можно разными способами, например с помощью команды print/printf: Чтение и модификация памяти при помощи команды p (print) # вывод содержимого двойного слова в десятичном беззнаковом виде (gdb) p/u *0x80483ef $5 = 3102794883 # присвоение регистру esp значения 0 (gdb) p $esp = 0 $6 = (void *) 0x0 # присвоение значения 90h байту по адресу 8048413h (gdb) p/x *((char*)0x8048413)=0x90 $7 = 0x90 Однако при просмотре большого количества ячеек памяти выгоднее использовать специальную команду x, позволяющую задавать длину отображаемого блока памяти: Отображение дампа программы с помощью команды x # просмотр 16 двойных слов в hex-виде, начиная от $pc (gdb) x/16x $pc 0x80483ef <main+9>: 0xb8f0e483 0x00000000 0x04c7c429 0x00000624 0x80483ff <main+25>: 0xffbfe800 0x458dffff 0x24048988 0xfffeb4e8 0x804840f <main+41>: 0x90c3c9ff 0x90909090 0x90909090 0x90909090 0x804841f <main+57>: 0xe5895590 0xf6315657 0x0cec8353 0x0000a0e8 # просмотр 16 байт слов в hex-виде, начиная от $pc (gdb) x/16xb $pc 0x80483ef <main+9>: 0x83 0xe4 0xf0 0xb8 0x00 0x00 0x00 0x00 0x80483f7 <main+17>: 0x29 0xc4 0xc7 0x04 0x24 0x06 0x00 0x00 Хакеров, начинающих свой жизненный путь с gdb, такая форма подачи информации быть может и устроит, но пользователям soft-ice она покажется слишком расточительной. Хорошо бы получить классический hex-дамп... И это действительно можно сделать! Достаточно создать реализацию своей собственной команды (назовем ее ddd), отображающей дамп с помощью функции printf. В отличие от soft-ice, отладчик gdb бесконечно расширяем, и если нас что-то не устаивает, практически всегда можно переделать это под свой вкус. Исходный код пользовательской команды ddd, выводящий дамп в стиле soft-ice и turbo-debugger define ddd set $ddd_p = 0 printf "%08Xh:",$arg0 while $ddd_p++ < 16 printf " %02X",*(unsigned char*)$arg0++ end printf "\n" end А вот пример ее использования: Дамп памяти, выведенный пользовательской командой ddd (gdb) set $t = $esp (gdb) ddd $t BFFFFA50h: 8E FF 77 01 E0 FA FF BF 38 6E BFFFFA5Ah: 01 40 34 FB FF BF 94 FA FF BF BFFFFA64h: D0 42 03 40 88 77 01 40 2F 00 Необходимость введения дополнительной переменной (в данном случае это переменная $t) объясняется тем, что команда ddd спроектирована так, чтобы отображать по 10h байт за раз, начиная с указанного адреса, а при нажатии на <Enter> (в gdb – повтор последней команды) — следующие 10h байт и т.д. При этом переданный команде аргумент используется для хранения последнего отображенного адреса. Вызов ddd $esp приведет к тому, что значение регистра $esp окажется увеличенным на 10h и программа просто развалится. Естественно, при желании можно переписать команду ddd так, чтобы она не имела никаких побочных эффектов и отображала не 10h байт памяти, а ровно столько, сколько ей скажут. |