ASLR是一个捉迷藏游戏:如果攻击者成功溢出缓冲区并覆盖指针,操作系统会在随机位置加载应用程序代码(主要可执行文件及其 DLL),以使攻击者更难实际击中一个有意义的位置。通过施工,当操场更大时,它会更好地工作。64 位模式下的扩展地址空间是一个更大的游乐场。
量化一下:在 32 位模式下,地址空间最多为 32 位宽(当内核不知道 64 位模式时,实际上是 31 位)。DLL 加载器必须尊重页面对齐,并且在 x86 上页面为 4 kB。这在 ASLR 的随机化中最多提供 20 位的熵,但实际上低于此值,因为将 DLL 分布在整个地址空间会导致更高的碎片(阻止应用程序分配,例如,1 GB 的连续缓冲区,这在编辑图片或电影时很常见)。这就是您引用的文字所暗示的内容。例如,假设 DLL 加载仅发生在地址空间的八分之一内,即 29 位;通过对齐,这意味着 17 位熵,即任何给定 DLL 的 131072 个可能位置。任何状况之下,
在 64 位模式下,地址空间扩展到 48 位,在 Windows 上降低到 44 位,因为它们没有费心去超越。这增加了 12 位熵;换句话说,它乘以 4096 攻击者的努力(以防攻击者依赖运气)。
因此,确实在某种程度上,64 位模式的扩展地址空间增加了安全性。当然,ASLR只有当一个缓冲区溢出任何影响已经发生,在这种情况下,你已经是大麻烦。