2017-02-02 10 views
0

Я недавно интересовался чтением книг и статей о взломе, и я узнал, что Взлом: искусство эксплуатации - это просто обязательное название. Я следую основным учебным пособиям о том, как работать со стандартными инструментами Linux и анализировать ваш код (глава программирования). Я не новичок в программировании, но работа с терминалом Linux для меня совершенно новая. Я использую последнюю версию Kali Linux.(GDB) Точки останова и дизассемблирования

Сейчас моя простая программа, приведенная ниже, должна использоваться для анализа того, как работает сегмент стека.

int main(){ 
    void stack_func(int a,int b, int c, int d){ 
    char first; 
    int second; 

    first = 'c'; 
    second = 220; 
    } 

    stack_func(1,2,3,4); 
    return 0; 
} 

Первая проблема, я не могу добавить любые точки останова для внутренних функций. Ни мои функции, как stack_func(), ни функции из таких библиотек, как strcpy и т. Д. Согласно этой книге ожидаемая точка останова должна быть разрешена. Шахта просто игнорируется, и программа заканчивается.

[email protected]:~/Folder# gdb -q ./stack 
Reading symbols from ./stack...done. 
(gdb) b stack_func 
Function "stack_func" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (stack_func) pending. 
(gdb) run 
Starting program: /root/Folder/stack 
[Inferior 1 (process 20421) exited normally] 
(gdb) 

Вторая проблема заключается в том, что демонтирует также не работает для моей функции. Опять же в соответствии с книгой я должен уметь видеть код ассемблера для моей функции stack_func(), но результат ниже.

(gdb) disass stack_func() 
No symbol "stack_func" in current context. 
(gdb) 

Приносим извинения за любые грамматические ошибки в тексте. :)

+0

Ваша функция не-побочный эффект, вероятно, просто удаляется компилятором, или по крайней мере, в строгом соответствии. –

+0

Вы пытались переместить 'stack_func' вне' main'? –

+0

Да, я попробовал, чтобы сообщение об ошибке выглядело так. 'Вы не можете сделать это без процесса для отладки. ' – Jacobe

ответ

1

Проблема в том, что вы определили stack_func внутри другой функции. Это называется nested function, и это расширение gcc в GNU C. Эта функция имеет немного другое имя символа, чем вы ожидаете. Чтобы узнать это точное имя символа можно использовать nm инструмент:

[ tmp]$ nm a.out |grep stack_func 
00000000004004a6 t stack_func.1761 

и установить точку останова и разбирать в БГД:

[ tmp]$ gdb -q ./a.out 
Reading symbols from ./a.out...done. 
(gdb) b 'stack_func.1761' 
Breakpoint 1 at 0x4004ba: file 111.c, line 6. 
(gdb) disassemble 'stack_func.1761' 
Dump of assembler code for function stack_func: 
    0x00000000004004a6 <+0>: push %rbp 
    0x00000000004004a7 <+1>: mov %rsp,%rbp 
    0x00000000004004aa <+4>: mov %edi,-0x14(%rbp) 
    0x00000000004004ad <+7>: mov %esi,-0x18(%rbp) 
    0x00000000004004b0 <+10>: mov %edx,-0x1c(%rbp) 
    0x00000000004004b3 <+13>: mov %ecx,-0x20(%rbp) 
    0x00000000004004b6 <+16>: mov %r10,-0x28(%rbp) 
    0x00000000004004ba <+20>: movb $0x63,-0x1(%rbp) 
    0x00000000004004be <+24>: movl $0xdc,-0x8(%rbp) 
    0x00000000004004c5 <+31>: nop 
    0x00000000004004c6 <+32>: pop %rbp 
    0x00000000004004c7 <+33>: retq 
End of assembler dump. 
(gdb)