【发布时间】:2015-07-04 03:34:51
【问题描述】:
我对 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 对本地开发没用吗?
【问题讨论】:
-
如果 DLL 将被加载到不同的地址,那么它必须被重新定位并且 RAM 页面不能再被共享。 ASLR 的主要观点是它在您机器上的加载位置与它在我的机器上的加载位置不同。当您重新启动时,它也会有所不同。
-
据我记忆.. 每个进程都有一个表,将虚拟页面的地址转换为物理页面。每个进程都有自己的唯一表。 Microsoft 不能一次将 DLL 加载到物理内存中,并为每个进程将 DLL 加载到不同的虚拟地址中吗?
-
不,重定位会更改代码,因此一份副本不再有效。
标签: windows security reverse-engineering exploit aslr