Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Покорение вершин отладки

Крис Касперски

Хакер, номер #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 байт памяти, а ровно столько, сколько ей скажут.

Назад на стр. 095-118-3  Содержание  Вперед на стр. 095-118-5