Использование GDB без отладки символов на x86?

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

0

4 ответы

Без отладочных символов вы можете отлаживать только на уровне ASM. Хорошо, вы получите больше бит , но вы не достигнете очень большого расстояния, если не поймете немного ASM и код, который генерирует компилятор. Это позволит вам провести простой контроль локальных переменных и т. Д. , если вы знаете, что делаете.

Если у вас есть источник, гораздо проще просто перекомпилировать его.

0
добавлено
+1, GDB в двоичном формате, скомпилированном без символов (или даже достаточно оптимизированном двоичном файле), лучше всего работает как отладчик уровня сборки - задача, на которую он достаточно компетентен.
добавлено автор Falaina, источник

Все, что вы можете сделать, это посмотреть на регистры и содержимое стека - вам придется делать все, выбирая, для чего используются вещи, как упоминает Дремон.

0
добавлено

Ну, самое главное, чтобы вы могли разматывать стек. Это можно сделать тремя способами:

  • Построение отладочных символов с помощью -g

  • В системах, в которых исключение C ++ отключается через таблицы (возможно, что-нибудь ELF в наши дни?), -funwind-tables указывает, что он генерирует такие таблицы независимо от языка, и GDB может использовать эти таблицы (по крайней мере , с x86 linux он может).

  • Или, если это не так, по крайней мере убедитесь, что -fomit-frame-pointer не включен

0
добавлено

Чтобы начать, вы можете сделать это;

gdb "whatever"
break __libc_start_main
r

который установит точку останова в коде libt crt0 и позволит вам разбить до main, даже если целевой бинарный файл полностью лишен.

Это приведет вас к запущенному состоянию в точке останова перед большинством пользовательских кодов. Затем вы можете сделать один шаг, разложить, сбросить память и т. Д. ... до вашего сердца.

Это работает на всех платформах, ведь ваш вопрос об IA-32/x86 не имеет значения.

0
добавлено
очень хорошо. Было бы здорово упомянуть, что «дизассемблировать» - это команда gdb, которая сбрасывает ASM. Теперь вы можете прочитать (или, в моем случае, посмотреть) код ASM! Ура!
добавлено автор Lotus, источник
Вот хороший учебник об отладке удаленных двоичных файлов с помощью GDB.
добавлено автор patryk.beza, источник