在 32 位和 64 位 Linux 和 Windows 中,ASLR 会随机化多少位内存地址

在 32 位和 64 位 Linux 和 Windows 中,ASLR 会随机化多少位内存地址

在 32 位和 64 位 Linux 和 Windows 中,ASLR 会将多少位内存地址随机化?请举一些例子。

答案1

以下内容摘自Technet 文章其中包含附加信息。

在 Windows 8 之前,64 位可执行映像获得的熵量与随机化 32 位可执行映像时使用的熵量相同(8 位,即 256 分之一的正确猜测概率)。从 Windows 8 开始,在大多数情况下,应用于 64 位映像的熵量显著增加:

DLL images based above 4 GB: 19 bits of entropy (1 in 524,288 chance of guessing correctly)
DLL images based below 4 GB: 14 bits of entropy (1 in 16,384 chance of guessing correctly). 
EXE images based above 4 GB: 17 bits of entropy (1 in 131,072 chance of guessing correctly).
EXE images based below 4 GB: 8 bits of entropy (1 in 256 chance of guessing correctly).

由于映像的基址而存在熵差异的原因同样是出于兼容性原因。Windows 内核当前使用映像的首选基址作为提示,以确定映像是否支持基于 4 GB 以上。基于 4 GB 以下的映像可能未在将其重新定位到 4 GB 以上的情况下进行测试,因此可能存在潜在的指针截断问题。因此,Windows 内核会尽最大努力确保这些映像在 4 GB 以下加载。由于这些限制,Windows 8 和 Windows 8.1 中的绝大多数 64 位 EXE 和 DLL 都基于 4 GB 以上,以确保它们能够从最高程度的熵中受益。默认情况下,Visual C++ 工具链生成的 64 位映像也基于 4 GB 以上的映像。

相关内容