我目前正在撰写有关堆栈溢出的文章并在下面创建了以下程序(供参考,我使用的是32位Linux机器):
#include <stdio.h>
#include <string.h>
int main () {
char foo[16];
strcpy(foo, "AAAAAAAAAAAAAAAABBBBC");
}
该程序是用
编译的 gcc stack_buffer_2.c -g -o stack_buffer_2 -fno-stack-protector
这个程序的作用是:
我在GDB中验证了这个程序的行为,这就是我得到的:
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0xb7e30043 in ?? () from /lib/i386-linux-gnu/libc.so.6
该程序试图在此上下文中跳转到0xb7e30043(溢出值,带有0x43和null终止符)而不是原始值0xb7e31637,这是__libc_start_main的返回点。
对我来说,事情变得棘手。做一个&#34; info proc映射&#34;,我看到0xb7e30043好像&#34;有效&#34;记忆(在/lib/i386-linux-gnu/libc.so.6内)
我知道段错误可以由我不会拥有的内存或未映射的段触发。但是在这种情况下,因为这是在我的应用程序的内存空间内,并且libc被映射到它,为什么我会得到段错误?
我怀疑这是由于某种错位,因为溢出后EIP指向libc中的随机指令。如果是,我该如何调整呢?它背后的约束是什么,谁来执行它?内核,MMU?
答案 0 :(得分:0)
问题是0xb7e30043处的指令无效。
这是当前的指示:
0xb7e30043: add %cl,(%eax)
我查看了eax值,它为零。从那里,事情变得更容易。该进程尝试访问0x0处的内存,并因segfault而失败。