我一直在阅读这篇关于 Internet Explorer 漏洞利用的文章,我有点困惑为什么内存地址会受到堆喷射“工作”的影响。
该论文指出,该攻击使用 heap-spray 来喷射价值约 320MB 的 0x12121212。选择该地址是因为攻击控制了 0x12121212 及其周围的内存。事实上,内存地址 0x12121212 是放置 ROP 链的位置。
我很困惑为什么这在启用 ASLR 的情况下有效,内存地址不是每次都是随机的吗?
0x12121212 怎么能可靠使用?
我一直在阅读这篇关于 Internet Explorer 漏洞利用的文章,我有点困惑为什么内存地址会受到堆喷射“工作”的影响。
该论文指出,该攻击使用 heap-spray 来喷射价值约 320MB 的 0x12121212。选择该地址是因为攻击控制了 0x12121212 及其周围的内存。事实上,内存地址 0x12121212 是放置 ROP 链的位置。
我很困惑为什么这在启用 ASLR 的情况下有效,内存地址不是每次都是随机的吗?
0x12121212 怎么能可靠使用?
根据 Windows Internals 第 5 版一书,堆的 5 位 ASLR 偏差“乘以 64KB 以生成从 0 开始的最终基地址,初始堆的可能范围为 0x00000000 到 0x001F0000”。
因此,Windows 7 上 IE 的初始堆总是在 0x00000000 和 0x001F0000 之间,有 32 个可能的位置。通过用 320MB 的数据(0x14000000 字节)填充堆,攻击者几乎可以肯定地保证 0x12121212 地址被填充:
在 64 位 Windows 8 及更高版本中,当使用以下/HIGHENTROPYVA标志编译应用程序时,这种情况得到了缓解:堆的 ASLR 偏差的大小是 24 位,这导致在 1TB 的内存地址空间上堆有 16,777,216 个可能的位置。
您可以在BlackHat 2012 演讲“Windows 8 中的利用缓解改进”中找到有关 ASLR 的更多信息。