Использование GDB без отладки символов на x86?
Как использовать GDB для отладки программы, которая не имеет отладочных символов на 32-разрядном процессоре x86? Ознакомиться с аргументами функции, локальными переменными, разрешающими указателями было бы полезно знать, как это сделать.
Намерение не в том, чтобы использовать это для обратной инженерии, поскольку я иногда слишком ленив, чтобы установить отладочные символы, и было бы здорово узнать, как получить основную информацию из gdb.
Ответы
Ответ 1
Чтобы начать, вы можете сделать;
gdb "whatever"
break __libc_start_main
r
который установит точку останова в коде libc crt0 и позволит вам разбиться до основного, даже если целевой бинарный файл полностью лишен.
Это приведет вас к запущенному состоянию в точке останова перед большинством кода пользователя. Затем вы можете сделать один шаг, дизассемблировать, сбросить память и т.д.... до вашего сердца.
Это работает на всех платформах, ведь ваш вопрос об IA-32/x86 не имеет значения.
Ответ 2
Без отладки символов вы можете отлаживать только на уровне ASM. Хорошо, вы получите немного больше информации, но вы не получите очень далеко, если не поймете немного ASM и код, который генерирует компилятор. Это позволит вам провести простой контроль локальных переменных и т.д., Если вы знаете, что делаете.
Если у вас есть источник, гораздо проще просто перекомпилировать его.
Ответ 3
Все, что вы можете сделать, это посмотреть на регистры и содержимое стека - вам придется все сделать, указав, для чего используются, как упоминает Дремон.
Ответ 4
Ну, самое главное, чтобы вы могли раскрутить стек. Это можно сделать тремя способами:
-
Построение отладочных символов с помощью -g
-
В системах, которые исключают исключение С++ через таблицы (возможно, что-нибудь ELF в эти дни?), флаг -funwind-tables
будет сообщать он генерирует такие таблицы независимо от языка, и GDB может использовать эти таблицы (по крайней мере, с помощью x86 linux он может).
-
Или, если это не удается, по крайней мере убедитесь, что -fomit-frame-pointer
не включен