缓冲区溢出攻击脚本

信息安全 linux 开发 C++
2021-08-13 17:46:17

我看到了各种不同的缓冲区溢出攻击脚本。许多脚本包含如下所示的行:

char code[] =
"\xdb\xd7\xd9\x74\x24\xf4\xb8\x79\xc4\x64\xb7\x33\xc9\xb1\x38"
"\x5d\x83\xc5\x04\x31\x45\x13\x03\x3c\xd7\x86\x42\x42\x3f\xcf"

这个来自CastRipper [.m3u] 2.9.6 堆栈缓冲区溢出漏洞利用有人能解释一下这个位是什么吗?它到底在做什么?

它看起来像我在取证工具上看到的 Linux 头文件。

2个回答

它实际上是字节码

字节码,也称为 p-code(可移植代码),是一种指令集形式,旨在由软件解释器高效执行。与人类可读的源代码不同,字节码是紧凑的数字代码、常量和引用(通常是数字地址),它们对程序对象的类型、范围和嵌套深度等事物的解析和语义分析结果进行编码。因此,它们允许比直接解释源代码更好的性能。

它是由 CPU 直接理解的指令组成的编译程序。它通常用于通过使易受攻击的运行程序通过溢出其缓冲区并将返回地址作为字节码程序的第一条指令的地址来执行该程序来利用漏洞。通常你会尝试生成一个交互式 shell,在这种情况下它被称为shellcode

在计算机安全中,shellcode 是一小段代码,用作利用软件漏洞的有效负载。它被称为“shellcode”,因为它通常启动一个命令 shell,攻击者可以从中控制受感染的机器,但任何执行类似任务的代码都可以称为 shellcode。因为payload的功能不仅仅局限于生成一个shell,所以有人认为shellcode这个名字是不够的。1然而,取代该术语的尝试并未获得广泛接受。Shellcode 通常用机器码编写。

有一本关于该主题的好书,名为Shellcoder's Manual

背景:

您看到的是机器语言代码。它们是对 CPU 芯片的实际指令的数据值。

当程序员用 C 或 C++ 等高级语言编写程序时,称为编译器的工具会将这些指令转换为机器语言。通常,程序员并不关心那些机器语言指令。但是,编写这些编译器的程序员当然非常关心机器指令,编写例程优化版本的人也是如此(这在高级语言中可能效率低下)。黑客也是如此。

即使程序员有理由关心机器指令,他们也不会像这样以难以阅读的原始字节值编写代码。相反,程序员将使用称为汇编语言的助记指令集。助记符只是代表您在此处看到的数字的缩写名称。一个简单的例子是MOV CL,0x38将字节值 38 移动到名为 C 的寄存器的低半部分。在幕后,“MOV CL”是一个值为 b1 的机器语言字节。

一种称为反汇编程序的工具将帮助将您看到的数字翻译成人类更容易阅读的汇编语言。您可以将这些字节放入http://onlinedisassembler.com/odaweb/#并查看它们将导致 CPU 执行的指令。您的样本包含以下说明:

.data:0x00000006    b879c464b7  mov eax,0xb764c479
.data:0x0000000b    33c9        xor ecx,ecx
.data:0x0000000d    b138        mov cl,0x38
.data:0x0000000f    5d          pop ebp
.data:0x00000010    83c504      add ebp,0x4
.data:0x00000013    314513      xor DWORD PTR [ebp+0x13],eax
.data:0x00000016    033cd7      add edi,DWORD PTR [edi+edx*8]
.data:0x00000019    864242      xchg BYTE PTR [edx+0x42],al
.data:0x0000001c    3f          aas
.data:0x0000001d    cf          iret

(可以看到上面的助记汇编指令包括mov、xor、pop等)

但是,要为更多的失望做好准备。您选择了一种非常复杂的攻击,该攻击利用了一种称为返回导向编程 (ROP) 的技术,因此大多数字节对我们来说毫无意义,因为它们不是 CPU 指令。它们主要是包含其他例程的参数和地址的数据。这使得这个漏洞特别难以在没有大量工作的情况下进行逆向工程。

更接近您的答案:

对于您的问题,缓冲区溢出是由于 x86 架构上使用内存的方式而起作用的。当程序员允许内存被覆盖时,额外的数据会直接覆盖在其他数据之上。如果你写了正确的字节数,那别的东西就是函数的返回指针。如果您在缓冲区数据中提供机器语言例程,然后覆盖返回指针以返回到您的缓冲区(而不是其正常的返回位置),当 CPU 返回时它将执行您的代码而不是它打算执行的代码。

欺骗指令指针到黑客需要它去的地方的机器代码被称为漏洞利用代码。漏洞利用代码是自定义编写的,以利用每个特定的错误。

对黑客有用的代码称为有效载荷。有效载荷通常是由其他人预先考虑好的,并且通常是黑客的复制和粘贴事件。一个非常常见的有效载荷称为“shellcode”,它是向攻击者生成命令 shell 的机器指令。

漏洞利用需要两者。一旦漏洞获得控制权,它就会调用 shellcode,为黑客提供他想要的访问权限。

一个很好的资源:

这里有一个关于这种利用的在线教程: http ://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html 请注意,这是非常深奥的东西,该页面的作者假设您了解CPU 操作、堆栈、指针、汇编语言、机器语言等基础知识。