2017-02-02 69 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

你有沒有試過移動'main'之外的'stack_func'? –

+0

是的,我現在嘗試了這樣的錯誤信息。 '你不能這樣做,沒有一個過程來調試。' – Jacobe

回答

1

問題是你在另一個函數裏面定義了stack_func。這稱爲nested function,它是GNU C中的gcc擴展。此函數有一點比您期望的其他符號名稱。要找出它的確切符號名稱可以使用nm工具:

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

並設置斷點,在gdb拆卸:

[ 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)