通过使用共享页确定库地址来绕过 Windows ASLR



我对ASLR非常熟悉,但是今天我听到了一个关于在Windows中实现ASLR的新有趣的事实。

为了优化性能,如果进程 A 和 B 加载相同的 dll Windows将只将其加载一次到物理内存,并且两个进程将通过共享页面共享相同的实例。

这是旧消息..但有趣的是,进程 A 和 B 都将在同一个虚拟地址中加载共享库(为什么??

在我看来,任何本地攻击(例如权限提升)都可以通过以下方式轻松绕过 ASLR:

1. Create a new dummy process
2. Check the address of dlls of interest (kernel32, user32 ..)
3. Attack the privileged process and bypass ASLR with the information from step 2.

我使用 Olly 做了一些简单的测试,发现共享库确实加载在同一个虚拟地址中。

如果真的是这样,ASLR对本地开发毫无用处吗?

你是对的,ASLR 对本地攻击者几乎没有防御作用。它主要用于阻止远程攻击中的硬编码地址。

编辑:我之前的回答中的一些细节是不正确的,尽管上述观点仍然存在。启用 ASLR 的 DLL 的基址实际上是两者的功能:(1) Windows 在启动时从一组 256 个可能值中选择的随机偏移量;(2) DLL 的加载顺序,对于已知 DLL,会话管理器在系统启动期间随机化该顺序。因此,仅知道随机偏移量不足以计算任意 ASLR DLL 的基址。但是,如果您能够直接观察共享内存中目标 DLL 的地址,如您所描述的那样,那么无论如何所有赌注都会失败。

来源:http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdfWindows Internals, 6th Edition

最新更新