ASLR:为什么在 32 位系统上只有 12 位发生变化?

信息安全 aslr
2021-09-11 10:37:04

我一直在阅读有关绕过 ASLR 的帖子。在 32 位系统上,这似乎是微不足道的,但我惊讶地发现它是多么微不足道。暴力破解 ASLR 地址只需几秒钟。原因似乎是根据我的测试,地址中只有 12 位实际发生了变化:

export BLAH=$"/bin/sh"

BLAH will be at 0xbff5a78b
BLAH will be at 0xbf87778b
BLAH will be at 0xbfe1e78b
BLAH will be at 0xbf9f778b
BLAH will be at 0xbffc378b
BLAH will be at 0xbffd978b
BLAH will be at 0xbfa7f78b
BLAH will be at 0xbf94878b
BLAH will be at 0xbfe4378b
BLAH will be at 0xbff7978b
BLAH will be at 0xbfe4078b

似乎在我的笔记本电脑上所有随机地址都是

BF XX X7 8B

其中 X 是随机十六进制。我对 CPU 低级工作的了解非常有限,那么为什么只有这些字节会改变呢?

说在 32 位机器上只有16^3 = 4096ASLR 地址是否正确?

在 64 位系统上更改了多少位?

3个回答

32 位上的 ASLR 相当有限,但我认为您所看到的是系统 ASLR 偏差值的人工制品。

在启动时,会为正在运行的 Windows“实例”随机生成一个偏差值。尽管地址的某些部分在同一进程的实例中看起来是相同的,但它们实际上只是从偏差值中得到的,并且该值会在重新启动时发生变化。

因此,实际上,它并不是真正可利用的。地址基数将足够随机,以至于路过式漏洞利用可能会失败,即使它在实例之间没有太大变化。

除了@Polynomial 解释的内容(可能适用也可能不适用,取决于您运行的是 Windows 还是其他操作系统),ASLR 交换页面:这就是MMU所知道的。一页为 4 kB(在 x86 处理器上),因此地址的低 12 位不受 ASLR 影响。这最多留下 20 位供 ASLR 使用。地址空间分配问题可能会进一步减少可以通过 ASLR 修改的位数(如果 DLL 过于分散在地址空间周围,可能会阻止分配大的连续空闲 RAM 块——这被称为碎片) .

在 64 位操作系统上,地址空间更大;不是完整的 64 位,因为 CPU 实际上并不支持它,但可以观察到 44 或 45 位(这取决于 CPU 版本和操作系统品牌和版本)。因此,您将获得由 ASLR 随机化的十几个额外位。

因为 12 位足以提供有效的(即使不是完美的)安全性。

恶意软件在注入缓冲区溢出时只有一次机会。如果它失败了,应用程序很可能会崩溃而不会感染程序。12 位随机化意味着恶意软件每 2^12 或 4096 次只能工作一次。如果我是恶意软件作者或黑客,那意味着我每次尝试都可能会失败。