【问题标题】:Microsoft's ASLR is weird微软的 ASLR 很奇怪
【发布时间】:2010-09-07 01:24:59
【问题描述】:

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

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

...

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

【问题讨论】:

    标签: windows dll portable-executable aslr


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      记录在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 必须选择 在支持 ASLR 使用 /DYNAMICBASE 链接器选项。

      ASLR 还随机化堆和堆栈 记忆:

      • 当应用程序在 Windows Vista 及更高版本,堆 manager 将在 随机位置,以帮助减少 尝试利用 基于堆的缓冲区溢出成功。 堆随机化由 所有正在运行的应用程序的默认设置 在 Windows Vista 及更高版本上。

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

      【讨论】:

      • 请给我文件的网址。
      • 谢谢兰。对于EXE PE,我认为它可能是正确的。但是对于一个 Dll,它仍然有 1/2 的概率起作用。有点奇怪。迈克尔霍华德错了吗? ——当然我不相信他是错的。可能有什么我误解了。
      【解决方案3】:

      昨天安装了新的 Win8 RC x64。

      小心!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多