Можно ли отлаживать основной файл, сгенерированный исполняемым файлом, скомпилированным без флага gdb?
Если да, какие-либо указатели или учебные пособия по нему?
Можно ли отлаживать основной файл, сгенерированный исполняемым файлом, скомпилированным без флага gdb?
Если да, какие-либо указатели или учебные пособия по нему?
Да, ты можешь. Хотя это будет непросто. Я приведу вам пример.
Допустим, у меня есть следующая программа с именем foo.c:
main()
{
*((char *) 0) = '\0';
}
Соберу и позабочусь, чтобы не было символов:
$ cc foo.c
$ strip a.out
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
Ладно, пора запускать:
$ ./a.out
Segmentation fault (core dumped)
Упс. Кажется, это ошибка. Запустим отладчик:
$ gdb ./a.out core
[..]
Reading symbols from /tmp/a.out...(no debugging symbols found)...done.
[..]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x0804839c in ?? ()
(gdb) bt
#0 0x0804839c in ?? ()
#1 0xb7724e37 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#2 0x08048301 in ?? ()
Хм, выглядит плохо. Никаких символов. Можем ли мы выяснить, что произошло?
(gdb) x/i $eip
=> 0x804839c: movb $0x0,(%eax)
Похоже, он пытался сохранить байт с нулевым значением в ячейке памяти, на которую указывает регистр EAX. Почему это не удалось?
(gdb) p $eax
$1 = 0
(gdb)
Это не удалось, потому что регистр EAX указывает на нулевой адрес памяти, и он попытался сохранить байт по этому адресу. Ой!
К сожалению, у меня нет указателей на хорошие учебники. Поиск по запросу «реверс-инжиниринг gdb» дает несколько ссылок с потенциально полезными фрагментами.
Обновление:
Я заметил комментарий, что речь идет об отладке дампа ядра у заказчика. Когда вы отправляете клиенту удаленные двоичные файлы, вы всегда должны хранить отладочную версию этого двоичного файла.
Я бы рекомендовал не разбирать и даже давать исходный код. Весь код, который я пишу, отправляется заказчику вместе с исходным кодом. Я слишком много раз был на стороне клиента, сталкиваясь с некомпетентным поставщиком, который отправил сломанную часть программного обеспечения, но не знает, как это исправить. Это отстой.
Кажется, это дубликат этого вопроса:
Основной файл отладки без символов
Там есть дополнительная информация.
Да, вы можете, это то, что делают люди, которые, т. е. пишут крэки, к сожалению, у меня больше нет слайдов и документов курса, который я изучал в университете, но поиск в Google reverse engineering
или disassembly tutorials
даст вам некоторые отправные точки. Также важно знать, как ориентироваться в ассемблере.
Наш класс был основан на книге, в основном главы 1 и 3, но сейчас вышло новое издание.
Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron
который объясняет основы компьютерных систем, а также дает вам хорошие знания о работе программ в системах.
Также при изучении этого имейте в виду, что 64-битный процессор имеет другой код сборки, чем 32-битный процессор, на всякий случай.
Если программа скомпилирована без флага -g, вы не сможете отладить файл ядра.
В противном случае вы можете сделать так: исполняемый основной файл gdb
Дополнительную информацию можно найти по адресу: http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf