ASCII-Armoring 如何帮助防止缓冲区溢出攻击?

信息安全 攻击预防 硬化 缓冲区溢出
2021-09-08 23:28:39

我正在阅读有关Wikipedia 上的 return-to-libc 攻击的信息。

根据我从文章中阅读和理解的内容,ASCII 装甲意味着二进制数据通过将它们分组为 8 位块来转换为 ASCII 值。

文章引用:

实际上,使用 ASCII-Armoring,所有系统库(例如 libc)地址都包含一个 NULL 字节。然而,同样的概念可以用于类似且更高级的攻击,称为 return-to-plt,攻击者不是返回 libc,而是使用二进制文件中加载的 PLT 函数(例如 system@plt、execve@plt、 sprintf@plt、strcpy@plt 等...)。

有人可以解释一下,ASCII 装甲究竟是如何防止缓冲区溢出的?我没有得到它所说的部分,即系统库地址包含一个 NULL 字节。以及如何return-to-plt防止缓冲区溢出?我搜索了,但没有找到关于return-to-plt攻击的太多解释。

3个回答

如果地址在某些时候被视为以空字符结尾的字符串,则包含此“ASCII-Armored”地址将导致使用空字符结尾字符串的函数(例如 strcpy、strlen、sprintf)在结束时停止处理libc 地址。

C 中的许多缓冲区溢出是由于不小心将字符串读入固定大小的数组而没有进行边界检查的结果。

C 中的字符串只是简单的 char 数组,末尾带有 0 或 NULL 字符。标准库字符串函数,例如strcpy简单地将值从一个数组复制到另一个数组,直到遇到 NULL 字符。

通过强制攻击在有效负载中包含一个 NULL 或 0 字节作为系统调用地址,错误的字符串读取将被停止,因为他们认为该字符串终于结束了。

请记住,地址 0xFFFF00FF 实际上是四个字节(或字符),其中一个是 0x00。

在使用机器字节码设计缓冲区溢出攻击载荷时,黑客通常需要聪明地避免出现任何 0 字节。

大多数时候缓冲区溢出发生在我们strcpy(dest, src) 在源代码中。
现在,当您输入具有空字节的输入时,由于 ascii 装甲(如下面的输入示例所示),您无法避免这种情况,空字节之后的输入数据将被省略,不会被复制到堆栈区域,从而导致溢出不成功。请注意,目标程序仍可能崩溃。
./a.out $(python -c 'print "A"*20 + "\x08\x40\x12\x00" + "\x08\x40\x12\x12" ')
上述代码中的值仅作为示例。