Skip to main content

谈论Windows的ASLR技术

从WindowsNT6开始,M$对自己的操作系统加入了一个新的安全机制。ASLR是一种针对缓冲区溢出的安全保护机制。在应用程序被载入的过程中,系统每次都会分配一个随机的基址。这使得利用特定内存地址进行爆破的漏洞无法运行,也给黑客带来了新的挑战。

ALSR在应用程序中的具体表现

当ASLR应用到一个程序的时候会有几个特征。程序没有启动的时候,我们可以在程序的PE头中看到多出了一个结块,修改了一个标志位:.reloc和IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE标记位。标记位的值为0x0040。当我们使用HEX编辑器将这个标记位从8140修改成8100的时候,ASLR也就被禁用了。这样做可以为分析程序带来便利之处。

45615458425.png

干掉ASLR的几种方式

上文论述了修改PE头关掉ASLR的可行性,现在我们将讨论其他关闭ASLR的方式。在搜集资料之后,我们发现windows的注册表包含着开启关闭ASLR的键值。其中,键值0表示关闭ASLR,而删除该键可以开启ASLR。

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]"MoveImages"=dword:00000000

除此之外我们还可以使用M$官方的Enhanced Mitigation Experience Toolkit来针对单一进程启用或关闭ASLR。它可以在下面的链接中找到。

https://www.microsoft.com/en-us/download/details.aspx?id=54264

关于ALSR缺陷

ASLR确实可以保护用户免受一部分病毒的侵害,但是并不能阻止攻击者猜测内存布局。比如当攻击者在内存中申请很大一块地址,然后在目标app加载数据以前释放。这样一来有很大的概率应用程序会请求到我们刚刚释放的地址。这时候去分析我们释放的内存地址中的内容,也许能增加成功的几率。同理,当反ASLR应用于内核的时候,这就可能变成系统漏洞。