通过使用共享页面确定库地址来绕过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做了一些简单的testing,发现共享库的确在同一个虚拟地址中加载。

如果情况确实如此,那么ASLR对于本地利用是无用的吗?

你是对的,ASLR对于本地攻击者来说是很少的防御。 它主要是为了阻止远程攻击中的硬编码地址而设计的。

编辑:我以前的答案中的一些细节是不正确的,虽然上面的问题仍然存在。 启用ASLR的DLL的基地址实际上是以下两者的函数:(1)在启动时由Windows从一组256个可能值中选择的随机偏移; (2)加载DLL的顺序,对于已知的DLL,在系统启动期间被会话管理器随机化。 只知道随机偏移量不足以计算任意ASLR DLL的基地址。 但是,如果您能够直接观察到共享内存中目标DLL的地址,就像您所描述的那样,所有投注都是关闭的。

资料来源: http : //www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf Windows内部版本,第6版