【发布时间】:2019-06-14 08:38:06
【问题描述】:
所以我正在阅读 Hacking the Art of Exploitation,在书中,他们在 C 代码中使用了 strcpy() 函数:
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
然后他们继续编译源代码并使用gdb 对其进行分析。他在第 6 行、strcpy 函数和第 8 行设置了一个断点,但是当在strcpy 上设置一个断点时,它的内容如下:
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
我知道这是因为该库尚未加载,所以它询问他是否要将其作为挂起的断点。然后他运行程序并继续通过断点:
对他来说一切都很好,但是当我尝试在我的计算机上重新创建它时,我得到以下信息:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11b6: file char_array.c, line 6.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) break 8
Breakpoint 3 at 0x11d7: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 4021) exited normally]
(gdb)
注意它是如何完全跳过strcpy 断点的?好吧,我问我的一个朋友这里有什么问题,他告诉我编译时我错过了-fno-builtin 的论点。我对这个参数做了一些最小的谷歌搜索,我真正理解的是它可以让你在内置函数上设置断点。所以我用-fno-builtin 参数编译了程序,然后尝试重新创建它:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -fno-builtin -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11c6: file char_array.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x1040
(gdb) break 8
Breakpoint 3 at 0x11dc: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 2, 0xf7e510b0 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 3969) exited normally]
(gdb)
现在可以了!我有三个问题:
-
-fno-builtin参数到底在做什么? - 为什么会显示问号而不是
strcpy函数中
Breakpoint 2, 0xf7e510b0 in ?? () from /lib/i386-linux-gnu/libc.so.6
- 当我使用
-fno-builtin参数时,为什么它不要求将strcpy断点设置为挂起?
对不起,长篇大论,我只是想确保一切都被理解。
【问题讨论】:
-
2.你还没有为你的 libc 安装调试信息。 3.它知道在哪里可以找到strcpy,它不必等待“pending”状态。
标签: c gcc gdb reverse-engineering strcpy