将32位程序重新编译为64位程序,以使地址空间布局随机化更有效
尽管Windows的64位版本已经成为主流十多年了,但32位版本的使用者仍然很多。有些程序确实需要保持与第三方插件的兼容性,比如web浏览器。有时,开发团队认为程序所需的内存远远少于4 GB,因此32位代码可以节省空间。甚至Visual Studio在支持构建64位应用程序之后,在一段时间内还仍然支持32位应用程序。
实际上,从32位代码切换到64位代码会产生很小但可观察到的安全性好处。原因是随机化32位地址的能力是有限的。至于具体原因,奇热请观察图1中32位x86内存地址的分解方式。更多详细信息,请参见“物理地址扩展”。
内存地址分为多个组件,其中只有一些可以在运行时轻松随机化
操作系统不能简单地将地址的任意位随机化,在页面部分(0到11位)中随机分配偏移量将打破程序对数据对齐的假设。页面目录指针(位30和31)也不能被更改,因为第31位是为内核保留的,而第30位被物理地址扩展用作存储体交换技术,以寻址2 GB以上的RAM,这使得32位地址中的14位不能被随机化。
实际上,Windows只尝试随机化32位地址中的8位。这些是位从16到23,只影响地址的页目录条目和