ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
本文为一篇短文,用到了如下一些软件,安装这些软件主要是为了实现针对微软IE的ASLR进行绕过。
DivX Player 10.0.2 Yahoo Messenger 11.5.0.228 AOL Instant Messenger 7.5.14.8
这些软件包含了一系列的lib库,这些库加载到内存时并未进行ASLR,原因是这些库在编译时,没有设置dynamicbase标志。(译注:有关dynamicbase请参照此文http://msdn.microsoft.com/zh-cn/library/bb384887.aspx)。这些库可以在IE中被轻易的加载,因为这些库已经注册在系统中,因此可以未经允许而执行,并不会提示用户是否需要执行。(译注:文中含义可能是,当这些库被IE加载时,不会提示用户,系统会认为内存中的库作为IE进程的一部分了。)如下为这些库的ProgID或者ClassID。
可以通过“Manage Add-ons”来查看哪些库可以未经允许即可加载。访问方法为:Explorerèè“工具”èè“管理插件”
然后选择“Run without Permission”
如下的脚本可以用来测试这些库是否已经被加载,或者点击此处来立即运行它。如果一个库已经被加载了,基地址x0100000000将会被重定位。值得注意的是雅虎的Yahoo Messager对象检查并未工作所以会失败,但是如果这个库被安装了,那么它仍会被载入。当然有关“AOL Instant Messenger”取决于你的下载版本,最新版本8.0.6.1并未包含“Aim.dll”。
<HTML> <SCRIPT language="JavaScript"> // if (DivX1() == "DivX") { document.write("DivX VOD Helper Plug-in npovshelper.dll loaded<br>"); } if (DivX2() == "DivX") { document.write("DivX Web Player (DivXBrowserPlugin) npdivx32.dll loaded<br>"); } if (DivX3() == "DivX") { document.write("DivX Web Player (RoviStreamPlayer) npdivx32.dll loaded<br>"); } if (Aol() == "AIM") { document.write("AOL Messenger isAim.dll loaded<br>"); } if (Yahoo() == "YahooM") { document.write("Yahoo Messenger YPagerChecker.dll loaded<br>"); } // function DivX1() { var divxver = ""; var divx = 0; var err = 0; try { divx = new ActiveXObject("OVSHelper.OVSHelperCOM.1") } catch (err) { document.write("DivX VOD Helper Plug-in npovshelper.dll failed<br>"); } if ((typeof divx) == "object") { divxver = "DivX"; } return divxver; } function DivX2() { var divxver = ""; var divx = 0; var err = 0; try { divx = new ActiveXObject("npdivx.DivXBrowserPlugin.1") } catch (err) { document.write("DivX Web Player (DivXBrowserPlugin) npdivx32.dll failed<br>"); } if ((typeof divx) == "object") { divxver = "DivX"; } return divxver; } function DivX3() { var divxver = ""; var divx = 0; var err = 0; try { divx = new ActiveXObject("nprovi.RoviStreamPlayer.1") } catch (err) { document.write("DivX Web Player (RoviStreamPlayer) npdivx32.dll failed<br>"); } if ((typeof divx) == "object") { divxver = "DivX"; } return divxver; } function Aol() { var aolver = ""; var aol = 0; var err = 0; try { aol = new ActiveXObject("isaim.aimlocator.1") } catch (err) { document.write("AOL Messenger isAim.dll failed<br>"); } if ((typeof aol) == "object") { aolver = "AIM"; } return aolver; } function Yahoo() { var yahoover = ""; var yahoo = 0; var err = 0; try { yahoo = new ActiveXObject("YPagerChecker.MessengerChecker.1") } catch (err) { document.write("Yahoo Messenger YPagerChecker.dll failed<br>"); } if ((typeof yahoo) == "object") { yahoover = "YahooM"; } return yahoover; } </SCRIPT> </HTML>
在Process Explorer中可以看到如下情况:
利用未设置dynamicbase标志的模块实现ASLR的绕过现在恐怕已经是过时的新闻了,现在有如下几种办法来解决。
1、安装微软的EMET,它支持多项减灾技术,其中一项是地址空间布局随机化(ASLR),强制模块地址对指定的进程随机化。(译注:有关EMET参见http://www.microsoft.com/en-us/download/details.aspx?id=29851)
2、升级IE到版本10或者11,这两个版本安装了补丁包,使得在Win7下强制ASLR。
3、升级系统到Windows 8,该版本的操作系统将支持强制ASLR,IE会通知OS随机化浏览器加载的所有模块。(译注:有关强制ASLR参见http://support.microsoft.com/kb/2639308
http://www.insanitybit.com/2012/11/09/windows-8-takes-aslr-to-the-next-level/)
4、通过插件管理窗口,将相应的库设置为无效。
如果运行IE10、IE11或者EMET,所有的地址都会被随机化处理,如下图所示:
[via greyhathacker 编译by fubeerf@freebuf ]