为什么这个程序导致段错误?

时间:2017-10-06 00:45:29

标签: virtual-memory segmentation-fault

我目前正在撰写有关堆栈溢出的文章并在下面创建了以下程序(供参考,我使用的是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

这个程序的作用是:

  • 填写所有&#34; foo&#34;数组&#39; A&#39;字符
  • 用&#39; B&#39;填充已保存的EBP字符
  • 写&#39; C&#39; char(加上空字符)保存ESP

我在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?

1 个答案:

答案 0 :(得分:0)

问题是0xb7e30043处的指令无效。

这是当前的指示:

0xb7e30043: add    %cl,(%eax)

我查看了eax值,它为零。从那里,事情变得更容易。该进程尝试访问0x0处的内存,并因segfault而失败。