2010-09-07 94 views
4

我看了一个ASLRed dll图像的基于32位进程的地址。
这不是一个完全的随机化。它只是随机化了1/2概率。微软的ASLR很奇怪

例如,一旦我加载dll,图像加载在0x12345678
我再次载入图像,图像上加载0x23456789(基址被改变!)
但我再次加载图像
0×12345678
0x23456789
0×12345678
0x23456789

。 ..

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

回答

11

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

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

1

它记录在one of 1 of 256 possible starting addresses

但我不认为它甚至适用于一个进程,但共享DLL的。

ASLR:is not on by default for process images。这是一个选择的事情,对于兼容性。(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中联系在一起的,后来 移动线程的堆栈到一个随机 位置,以帮助减少的机会 一个基于堆栈的缓冲区溢出 攻击会成功。

+1

请给我一个文件的URL。 – Benjamin 2010-09-07 02:01:11

+0

谢谢lan。对于EXE PE,我认为这可能是对的。但对于一个Dll,它仍然有1/2概率。有点奇怪。迈克尔霍华德错了吗? - 我当然不相信他错了。可能有些事我误解了。 – Benjamin 2010-09-07 03:59:01

0

昨天安装了新的Win8 RC x64。

小心!

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