“泄漏指针”,通常称为“悬空指针”,可用于创建攻击链以绕过分层安全系统。
DEP 背后的想法是您使内存区域不可执行,从而无法执行该区域中的 shellcode。单独的 DEP 真的很容易绕过,您可以直接 ret-to-lib,并调用您想要的任何函数, system()
是您的最爱。
但是,在 Windows 下,启用ASLR的库会有一个随机的内存空间,因此攻击者不知道system()
函数的内存地址,因此无法调用它。ASLR 背后的想法是,如果你不知道跳转到哪里,是否可以控制 EIP 并不重要。
能够读取随机内存区域的位置会破坏对 ASLR 的保护,因为现在您有了可靠的跳转位置。这可以通过多种方法来实现。在针对 IE 的 pwn2own 中使用了缓冲区溢出来简单地覆盖空终止符并读取数组末尾。但实际上最常见的技术是使用悬空指针,尽管有 ASLR,它仍可用于读取/写入甚至执行有效的内存位置。
即使使用 ASLR,也不是每个内存位置都是随机的。事实上,可执行二进制文件具有可预测的布局,因此您可以在ROP 链中针对自身使用可执行文件。然而,有时很难找到有用的 ROP 小工具,尤其是在目标二进制文件非常小的情况下。如果您无法构建有用的 ROP 链,那么内存泄露漏洞(例如悬空指针)是一种很好的攻击方法。需要注意的是,ASLR 只随机化页面的位置(内存地址的前几个字节)。如果您可以使用您的 shellcode 填充此页面中的一个区域,那么可以使用泄露的代码准确地执行您的 shellcode内存地址作为基础,然后希望你的 shellcode 位于这个随机位置的某个偏移量。
使用内存操作漏洞链通常只能在脚本环境中使用,例如 JavaScript。