我对 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 对本地开发毫无用处吗?