У меня нет целевого исполняемого файла gdb, и у меня даже нет стека, соответствующего этой цели. В любом случае я хочу пошагово, чтобы я мог проверить, что происходит в моем коде сборки, потому что я не эксперт в сборке x86. К сожалению, GDB отказывается выполнять эту простую отладку на уровне сборки. Это позволяет мне устанавливать и останавливаться на соответствующей точке останова, но как только я пытаюсь перейти на один шаг вперед, gdb сообщает об ошибке «Не удается найти границы текущей функции», и EIP не изменяется.
Дополнительные детали:
Машинный код был сгенерирован операторами gcc asm, и я скопировал его в то место памяти ядра, где он выполняется, из вывода objdump -d. Я бы не возражал против простого способа использовать загрузчик для загрузки моего объектного кода на перемещенный адрес, но имейте в виду, что загрузка должна выполняться в модуле ядра.
Я полагаю, другой альтернативой было бы создание поддельного модуля ядра или файла отладочной информации для передачи gdb, чтобы заставить его поверить, что эта область находится в программном коде. gdb отлично работает с самим исполняемым файлом ядра.
(Для тех, кто действительно хочет знать, я вставляю код во время выполнения в пространство данных ядра Linux внутри виртуальной машины VMware и отлаживаю его из gdb удаленно отлаживая ядро через встроенную заглушку gdb VMware Workstation. Обратите внимание, что я не пишу ядро эксплойтов; я аспирант по безопасности, пишу прототип.)
(Я могу установить точку останова для каждой инструкции внутри моей сборки. Это работает, но через некоторое время станет довольно трудоемким, поскольку размер сборочных инструкций x86 меняется, а расположение сборки будет меняться каждый раз при перезагрузке.)
Ответы:
Вы можете использовать
stepi
илиnexti
(что может быть сокращено доsi
илиni
) для пошагового выполнения вашего машинного кода.источник
start
эквивалентно, заtbreak main
которым следуетrun
(примечание:tbreak
вместоbreak
)Вместо того
gdb
, чтобы бегатьgdbtui
. Или бегитеgdb
с-tui
переключателем. Или нажмите C-x C-aпосле вводаgdb
. Теперь вы находитесь в режиме TUI GDB .Введите,
layout asm
чтобы отобразить сборку верхнего окна - это будет автоматически следовать за указателем инструкции, хотя вы также можете изменять рамки или прокручивать во время отладки. Нажмите, C-x sчтобы войти в режим SingleKey, гдеrun continue up down finish
т. Д. Сокращенно обозначается одной клавишей, что позволяет вам очень быстро проходить через программу.источник
Самое полезное, что вы можете сделать здесь, - это
display/i $pc
перед использованием,stepi
как уже было предложено в ответе R Samuel Klatchko. Это указывает GDB дизассемблировать текущую инструкцию каждый раз перед печатью приглашения; тогда вы можете просто продолжать нажимать Enter, чтобы повторитьstepi
команду.(Подробнее см. Мой ответ на другой вопрос - контекст этого вопроса был другим, но принцип тот же.)
источник