5

我观看了 32 位进程的基于 ASLRed dll图像的地址。
这不是完全随机化。它只是随机化了 1/2 的概率。

例如,一旦我加载了一个 dll,图像就会加载到0x12345678上。
然后我再次加载图像,图像加载到0x23456789。(基地址已更改!)
但我再次加载图像
0x12345678
0x23456789
0x12345678
0x23456789

...

他们为什么这样做?
是因为崩溃报告的频率吗?(为了获得重新部署的 dll 的相同崩溃地址)

4

3 回答 3

13

这是设计使然。通常,Windows 会在首次加载 DLL 时为 ASLR DLL 选择首选基地址,然后继续使用该地址,直到系统重新启动。这样,DLL 将在每个加载它的进程中映射到相同的地址,从而允许共享代码页。

但是,如果已从每个进程中卸载 DLL,则系统有时可能会在下次加载 DLL 时选择不同的基地址。它这样做是为了减少虚拟地址空间碎片,而不是出于安全原因。这就是您的情况似乎正在发生的事情。

于 2010-09-08T06:11:54.007 回答
2

它被记录为位于256 个可能的起始地址之一

但我认为它甚至没有应用于进程,而是应用于共享 DLL。

ASLR:进程映像默认不启用。为了兼容性,这是一个选择加入的事情。(3

地址空间布局随机化 (ASLR)

当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。对于支持 ASLR 的组件,它加载的所有组件也必须支持 ASLR。例如,如果 A.exe 使用 B.dll 和 C.dll,则这三个都必须支持 ASLR。默认情况下,Windows Vista 和更高版本将随机化系统 DLL 和 EXE,但 ISV 创建的 DLL 和 EXE 必须使用 /DYNAMICBASE 链接器选项选择支持 ASLR。

ASLR 还随机化堆和堆栈内存:

  • 当应用程序在 Windows Vista 和更高版本中创建堆时,堆管理器将在随机位置创建该堆,以帮助减少尝试利用基于堆的缓冲区溢出成功的机会。默认情况下,在 Windows Vista 及更高版本上运行的所有应用程序都启用堆随机化。

  • 当线程在与 /DYNAMICBASE 链接的进程中启动时,Windows Vista 和更高版本将线程的堆栈移动到随机位置,以帮助减少基于堆栈的缓冲区溢出利用成功的机会。

于 2010-09-07T01:56:04.760 回答
0

昨天安装了新的Win8 RC x64。

小心!

Kernel32.dll(64 位版本)在不同的进程中(当然是在单个会话中)具有不同的基地址。只有 ntdll.dll 基地址保持不变。我只好改代码,不能再依赖永久地址Loadlibrary了。

于 2012-06-10T10:28:37.600 回答