Погружение в технику и философию gdb

Изменение потока выполнения


Программа, загруженная командой "file" (или указанная в командной строке), находится в бесформенном состоянии, представляющим собой всего лишь совокупность байт, записанных в выделенном регионе адресного пространства. Новый процесс для нее еще не создан и трассировать ее невозможно. Во всяком случае до тех пор, пока мы не дадим команду "run" или "r" (которой обычно предшествует установка точки останова на функцию main или start). Будучи запущенной, программа будет работать до тех пор, пока не встретит точку останова или не получит no-stop

сигнал (см. "обработка сигналов"). Применение команды "run" к уже запущенной программе, приведет к ее перезапуску (в конфигурации по умолчанию отладчик запрашивает подтверждение).

Продолжить работу программы, остановленной по точке останова или сигналу, можно командой "continue" ("c"), действующей так же, как и "run" (т.е. работающей до точки останова/сигнала).

Чтобы передать управление по произвольному адресу, необходимо сделать "jump" ("j") за которым следует адрес, имя функции или регистр. В частности, "*$pc" по своему действию аналогична команде "continue", "j foo" передает управление на метку/функцию foo (если только она присутствует в таблице символов), а "*0x80484AA" – прыгает на адрес 80484AAh. Если одни и те же адреса используются многократно, их можно загнать в пользовательскую переменную командой "set $my_foo=0x80484AA", а затем использовать ее в качестве параметра команды jump – "*$my_foo". Отладчик soft-ice, кстати, ничего подобного делать не умеет!

Команда "until" ("u") продолжает выполнение программы вплоть до указанного адреса (например, "*0x080484ED"), при достижении которого останавливается и передает управление отладчику.
Как и "
jump", команда "until" поддерживает работу не только с метками и адресами, но и переменными, значительно упрощая взлом. Без аргументов "until" аналогична команде "nexti" (см. "трассировка") — она переходит на следующую машинную команду, пропуская функции и циклы.

Рассмотрим следующий код:

 

.text:080484EB             jb     short loc_80484EF    ; à на выход из цикла

.text:080484ED             jmp    short loc_8048532    ; à к началу тела цикла

.text:080484EF             lea    eax, [ebp + var_28]  ; первая команда за концом цикла


Содержание раздела