(GDB)断点和反汇编

时间:2017-02-02 23:10:24

标签: c linux gdb breakpoints disassembly

我最近对阅读有关黑客的书籍和文章感兴趣,我发现黑客攻击:剥削艺术只是一个必读的标题。我正在学习如何使用标准Linux工具和分析代码的基本教程(编程章节)。我不是编程的初学者,但使用Linux终端对我来说是一个新手。我正在使用最新版本的Kali Linux。

现在我的简单程序应用于分析堆栈段的工作原理。

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 这样的库中的函数等。根据本书,挂起的断点应该解决。我只是被忽略了,程序结束了。

root@root:~/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)  

我为文本中的任何语法错误道歉。 :)

1 个答案:

答案 0 :(得分: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)