小编zms*_*200的帖子

为什么我的 C 代码会抛出分段错误,即使返回指针指向看似有效的 shellcode 的内存地址?

我正在尝试遵循有关缓冲区溢出的教程(Vivek Ramachandran 的缓冲区溢出入门)。我实际上是在遵循他的代码,该代码在演示中对他有效,并且到目前为止对我也有效。

下面的 C 程序的目标是将退出系统调用的 shellcode 分配给一个变量,然后用 shellcode 变量的内存地址替换 main 函数的默认返回地址(指向 __lib_start_main),这样程序在完成主函数后执行 shellcode,然后优雅地退出程序,退出值为 20(如执行“exit(20)”)。不幸的是,程序以分段错误结束。我在 32 位 Linux Mint 上运行它。我使用 gcc 来编译代码,并使用 --ggdb 和 -mpreferred-stack-boundary=2 选项对其进行编译,并且我尝试了使用和不使用 -fno-stack-protector 选项。

这是代码:

#include<stdio.h>

char shellcode[] = "\xbb\x16\x00\x00\x00"
                   "\xb8\x01\x00\x00\x00"
                   "\xcd\x80";

int main(){

        int *ret;

        ret = (int *)&ret +2;

        (*ret) = (int)shellcode;

}
Run Code Online (Sandbox Code Playgroud)
  1. 首先定义一个名为 shellcode 的变量,该变量保存 shellcode。
  2. main函数被调用并定义了ret变量,该变量被加载到栈顶
  3. ret 变量的内存位置加上 2 个整数空间,即栈下 8 个字节的内存位置(返回指针的地址)被指定为 ret 变量的值。
  4. shellcode 变量的内存地址被写入由 ret 变量的值表示的内存地址 - 即返回地址。
  5. 当函数到达return指令时,就会执行shellcode,也就是exit函数。

我已经通过 gdb 运行了这个,一切似乎都检查出来了: shellcode 变量的内存位置是 0x804a01c

在 main 执行开始时,返回值位于第 3 个十六进制字并指向 …

c stack buffer-overflow shellcode

2
推荐指数
1
解决办法
1757
查看次数

标签 统计

buffer-overflow ×1

c ×1

shellcode ×1

stack ×1