我正在尝试遵循有关缓冲区溢出的教程(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)
我已经通过 gdb 运行了这个,一切似乎都检查出来了: shellcode 变量的内存位置是 0x804a01c