Можно ли отладить файл ядра, сгенерированный исполняемым файлом, скомпилированным без флага gdb? - PullRequest
8 голосов
/ 02 августа 2011

Возможно ли отладить файл ядра, сгенерированный исполняемым файлом, скомпилированным без флага gdb?

Если да, есть ли на нем какие-либо указатели или руководства?

Ответы [ 3 ]

15 голосов
/ 05 августа 2011

Да, вы можете.Это не будет легко, хотя.Я приведу вам пример.

Допустим, у меня есть следующая программа с именем 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" дает некоторые ссылки, которые могут содержать полезные фрагменты.

Обновление:

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

Я бы порекомендовал не удалять и даже предоставлять исходный код.Весь код, который я пишу, отправляется клиенту с исходным кодом.Я слишком много раз был на стороне клиента, сталкиваясь с некомпетентным поставщиком, который отправил сломанный программный продукт, но не знает, как его исправить.Это отстой.

Похоже, на самом деле это дубликат этого вопроса:

Отладочный файл ядра без символов

Там есть некоторая дополнительная информация.

2 голосов
/ 11 августа 2011

Да, вы можете, это то, что делают люди, которые пишут крэки, к сожалению, у меня нет слайдов и документов курса, который я читал в университете, но поиск в Google для 1001 * или disassembly tutorials дастВы некоторые отправные точки.Также важно знать, как разбираться в ассемблере.

Наш класс был основан на книге, в основном главы 1 и 3, но сейчас выходит новое издание

Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron

, который объясняет основы компьютерных систем, а также дает вам хорошие знания о работе программ в системах.

Также при изучении этого имейте в виду, что 64-битные процессоры имеют другой код сборки, чем 32-битные процессоры, на всякий случай.

0 голосов
/ 02 августа 2011

Если программа скомпилирована без флага -g, вы не можете отлаживать файл ядра.

В противном случае вы можете сделать это: исполняемый файл GDB corefile

Больше вы можете найти по адресу: http://wwwpub.zih.tu -dresden.de / ~ mlieber / practical_debugging / 04_gdb.pdf

...