通过使用共享页确定库地址绕过Windows ASLR
我对ASLR非常熟悉,但今天我听到了一个关于在Windows中实现ASLR的有趣的新事实 为了优化性能,如果进程A和进程B加载相同的dll,Windows将只向物理内存加载一次,并且两个进程将通过共享页共享同一实例 这是老消息。。但有趣的是,进程A和进程B都将在同一虚拟地址中加载共享库(为什么??) 在我看来,任何本地攻击(例如权限提升)都可以通过以下方式轻松绕过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
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抱歉,我认为我在这个细节上完全错了。我已经修改了我的答案以反映情况。