Подтвердить что ты не робот

Использование gdb для одноэтапного кода сборки за пределами указанного исполняемого файла приводит к ошибке "не может найти границы текущей функции"

Я за пределами исполняемого файла gdb, и у меня даже нет стека, который соответствует этой цели. Я все равно хочу сделать одноэтапный шаг, чтобы я мог проверить, что происходит в моем ассемблере, потому что я не эксперт в сборке x86. К сожалению, gdb отказывается выполнять эту простую отладку на уровне сборки. Это позволяет мне устанавливать и останавливать соответствующую точку останова, но как только я пытаюсь выполнить однократный шаг вперед, gdb сообщает об ошибке "Невозможно найти ограничения текущей функции", и EIP не изменяется.

Дополнительная информация:

Машинный код был сгенерирован операторами gcc asm, и я скопировал его в ячейку памяти ядра, где она выполняется, из вывода objdump -d. Я бы не прочь использовать простой способ использовать загрузчик для загрузки моего объектного кода на перемещенный адрес, но помните, что загрузка должна выполняться в модуле ядра.

Я полагаю, что другой альтернативой было бы создание фальшивого модуля ядра или файла информации об отладке, чтобы дать gdb, чтобы заставить его полагать, что эта область находится в программном коде. gdb отлично работает на самом исполняемом ядре.

(Для тех, кто действительно хочет знать, я вставляю код во время выполнения в пространство данных ядра Linux внутри VMware VM и отлаживаю его из удаленной отладки gdb с помощью встроенной в VMware Workstation заглушки gdb. не писать ядровые эксплоиты, я аспирант безопасности, пишущий прототип.)

(Я могу установить точку останова для каждой команды внутри моей сборки.Это работает, но будет довольно трудоемкой через некоторое время, так как размер инструкций сборки x86 меняется и расположение сборки будет меняться каждый раз, когда я перезагружу.)

4b9b3361

Ответ 1

Вы можете использовать stepi или nexti (который может быть сокращен до si или ni) для перехода через ваш машинный код.

Ответ 2

Вместо gdb запустите gdbtui. Или запустите gdb с помощью переключателя -tui. Или нажмите C-x C-a после ввода gdb. Теперь вы находитесь в режиме GDB TUI.

Введите layout asm, чтобы сделать сборку верхнего окна - это будет автоматически следовать указателю вашей команды, хотя вы также можете менять кадры или прокручивать их во время отладки. Нажмите C-x s, чтобы войти в режим SingleKey, где run continue up down finish и т.д. Сокращены до одного ключа, что позволяет вам быстро пройтись по вашей программе.

   +---------------------------------------------------------------------------+
B+>|0x402670 <main>         push   %r15                                        |
   |0x402672 <main+2>       mov    %edi,%r15d                                  |
   |0x402675 <main+5>       push   %r14                                        |
   |0x402677 <main+7>       push   %r13                                        |
   |0x402679 <main+9>       mov    %rsi,%r13                                   |
   |0x40267c <main+12>      push   %r12                                        |
   |0x40267e <main+14>      push   %rbp                                        |
   |0x40267f <main+15>      push   %rbx                                        |
   |0x402680 <main+16>      sub    $0x438,%rsp                                 |
   |0x402687 <main+23>      mov    (%rsi),%rdi                                 |
   |0x40268a <main+26>      movq   $0x402a10,0x400(%rsp)                       |
   |0x402696 <main+38>      movq   $0x0,0x408(%rsp)                            |
   |0x4026a2 <main+50>      movq   $0x402510,0x410(%rsp)                       |
   +---------------------------------------------------------------------------+
child process 21518 In: main                            Line: ??   PC: 0x402670
(gdb) file /opt/j64-602/bin/jconsole
Reading symbols from /opt/j64-602/bin/jconsole...done.
(no debugging symbols found)...done.
(gdb) layout asm
(gdb) start
(gdb)

Ответ 3

Самая полезная вещь, которую вы можете сделать здесь, - это display/i $pc, прежде чем использовать stepi, как уже было сказано в ответе R Samuel Klatchko. Это говорит gdb, чтобы разобрать текущую инструкцию непосредственно перед печатью запроса каждый раз; то вы можете просто нажать Enter, чтобы повторить команду stepi.

(см. мой ответ на другой вопрос более подробно - контекст этого вопроса был другим, но принцип тот же.)