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 ]

源链接

Hacking more

...