(GDB) 断点和反汇编
(GDB) Breakpoints and Disassemble
我最近对阅读有关黑客的书籍和文章很感兴趣,我发现 黑客:剥削的艺术 是必读的书名。我正在学习有关如何使用标准 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)
第二个问题是 disassemble 对我的函数也不起作用。再次根据这本书,我应该能够看到我的函数 stack_func() 的汇编代码,但结果如下。
(gdb) disass stack_func()
No symbol "stack_func" in current context.
(gdb)
对于文本中的任何语法错误,我深表歉意。 :)
问题是您在另一个函数中定义了 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 [=11=]x63,-0x1(%rbp)
0x00000000004004be <+24>: movl [=11=]xdc,-0x8(%rbp)
0x00000000004004c5 <+31>: nop
0x00000000004004c6 <+32>: pop %rbp
0x00000000004004c7 <+33>: retq
End of assembler dump.
(gdb)
我最近对阅读有关黑客的书籍和文章很感兴趣,我发现 黑客:剥削的艺术 是必读的书名。我正在学习有关如何使用标准 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)
第二个问题是 disassemble 对我的函数也不起作用。再次根据这本书,我应该能够看到我的函数 stack_func() 的汇编代码,但结果如下。
(gdb) disass stack_func()
No symbol "stack_func" in current context.
(gdb)
对于文本中的任何语法错误,我深表歉意。 :)
问题是您在另一个函数中定义了 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 [=11=]x63,-0x1(%rbp)
0x00000000004004be <+24>: movl [=11=]xdc,-0x8(%rbp)
0x00000000004004c5 <+31>: nop
0x00000000004004c6 <+32>: pop %rbp
0x00000000004004c7 <+33>: retq
End of assembler dump.
(gdb)