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

通过使用共享页确定库地址绕过Windows ASLR,windows,security,reverse-engineering,exploit,aslr,Windows,Security,Reverse Engineering,Exploit,Aslr,我对ASLR非常熟悉,但今天我听到了一个关于在Windows中实现ASLR的有趣的新事实 为了优化性能,如果进程A和进程B加载相同的dll,Windows将只向物理内存加载一次,并且两个进程将通过共享页共享同一实例 这是老消息。。但有趣的是,进程A和进程B都将在同一虚拟地址中加载共享库(为什么??) 在我看来,任何本地攻击(例如权限提升)都可以通过以下方式轻松绕过ASLR: 1. Create a new dummy process 2. Check the address of dlls of

我对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'd DLL的基址。但是,如果您能够直接观察共享内存中目标DLL的地址,正如您所描述的,那么所有的赌注都是无效的

资料来源:
Windows Internals,第6版

如果DLL将加载到不同的地址,则必须重新定位,并且RAM页面不能再共享。ASLR的要点是,它在您的机器上的加载位置与在我的机器上的加载位置不同。当你重新启动时,它也会不同。就我所记得的。。每个进程都有一个表,用于将虚拟页的地址转换为物理页。每个进程都有自己独特的表。Microsoft不能将DLL一次性加载到物理ram中,并为每个进程在不同的虚拟地址中加载DLL吗?不,重新定位会更改代码,使一个副本不再有效。非常有趣。。这种“技术”在野外使用吗?我读过一些关于本地漏洞利用的案例研究,从未见过攻击者使用这种技术。@MichaelEngstler抱歉,我认为我在这个细节上完全错了。我已经修改了我的答案以反映情况。