首页
社区
课程
招聘
[分享]cve-2012-0158两种poc分析
发表于: 2017-5-26 18:05 7825

[分享]cve-2012-0158两种poc分析

2017-5-26 18:05
7825

1.漏洞原理进行简介
2.分别对两个的 poc进行调试分析
3.进行分析总结

环境:windows xp sp3 pro
工具:windbg(dbgx866.11.1.404)   ida  office2003(standard)
样本来源:《漏洞战争》,看雪论坛

The (1) ListView, (2) ListView2, (3) TreeView, and (4) TreeView2 ActiveX controls in MSCOMCTL.OCX in the Common Controls in Microsoft Office 2003 SP3, 2007 SP2 and SP3, and 2010 Gold and SP1; Office 2003 Web Components SP3; SQL Server 2000 SP4, 2005 SP4, and 2008 SP2, SP3, and R2; BizTalk Server 2002 SP1; Commerce Server 2002 SP4, 2007 SP2, and 2009 Gold and R2; Visual FoxPro 8.0 SP1 and 9.0 SP2; and Visual Basic 6.0 Runtime allow remote attackers to execute arbitrary code via a crafted (a) web site, (b) Office document, or (c) .rtf file that triggers "system state" corruption, as exploited in the wild in April 2012, aka "MSCOMCTL.OCX RCE Vulnerability."《NVD》 非常经典的栈溢出漏洞

此poc来自《漏洞战争》中的。分析流程如下:
1. 分析poc的行为
2. 综合利用windbg 和 ida进行动态和静态分析。
首先直接打开windbg 和 word.exe,然后windbg中快捷键 F6 附件word.exe 如下图所示:
 
如下图当载入poc.doc的

在上图中关键信息已经标注出来,当载入poc.exe时候,最终在 EIP = 41414141处段下,当利用kb命令查看堆栈的时候,发现堆栈已经被破坏掉啦。利用 dps 查看详细的栈信息.

根据上图的栈信息 0x127b30 = 41414141   而0x127afc = 275c8a0a 此处的值,直接在查看0x275c8a0a地址处的反汇编代码如下如所示:  

从上图中可以获取获取到 0x275c8a0a 是函数的返回地址,地址0x275c8a05处的函数调用极可能就是溢出函数,根据函数的信息可知道,
MSCOMCTL!DLLGetClassObject+0x41a29 ,此函数调用发生在mscomctl.ocx中,此组件是打开doc文件时动态加载的,所以只在下bp断点是断不下来的。
接下来再上图的基础上持续向上查找,查找到0x275c8a0a 函数调用的起始处,如下图所示:
 

利用sxe ld mscomctl.ocx在动态加载的时候段下来。断下来之后直接在 地址0x275c89c7的地址出下int3 断点即可。

重新加载poc文件,如下图所示:
 
此时程序已经来到啦溢出函数的被调函数处,同时此时用ida 打开mscomctl.ocx 文件 (此文件在system32文件目录下 ) ,直接在函数窗口中打开 sub 0x275c89c7函数地址如图所示:
   
从上图中我们可以直接获取到函数参数,以及函数的调用信息。  这里我们先主要依靠windbg进行分析,
接下来直接利用  u 0x275c89c7 L64命令 查看100条反汇编指令如下图所示:

如图所示 重点部分已经标注,接下来直接使用命令 uf MSCOMCTL!DllGetClassObject+0x41a29 进行查看函数完整的反汇编指令。
其实仔细观察会发现,在溢出的被调用函数中,总共发生过两次相同的函数调用如下图所示:
 

单步运行到0x275c8a05 然后dd esp查看函数参数值。如图:

如上图,函数三个参数分别是 0x127b24 0xbfe06b0 0x8282  以及进入溢出函数前的ebp = 0x127b2c 进入函数后 ebp = 127af8  接下来继续单步运行程序直接来到地址275c87cb地址处如图所示:
 
如图所示当执行到地址275c87cb地址处的时候,可以观察esi 内存中包含41414141 而ecx = ox20a0 因此当执行 此指令时后,即可表明程序的执行已经被用户控制啦。

接下来分别对 0x275c87cb 地址处相关的寄存器(ecx esi edi )进行值溯源,详细分析程序。    
当程序执行到 地址0x275c87cb地址处的时候,再上图中可以观察到。 ecx = 20a0  edi = 127b24   esi = 5602008  从此地址向上翻看,也就是向低地址寻找的时候,发现 shr ecx,2 右移位指令,相当于将ecx/=4==20a0 的操作。 20a0 * 4 =  8280,此处暂且谨记。  接下来重新在如poc样本,分别在地址 0x275c89c7 第一次调用调用溢出函数时的0x275c876e 这两地址出下断点。  
当程序段在地址 0x275c89c7的时候,可以查看到

此时上层函数的返回地址是 0x275e701a 此层函数的ebp= 127b2c(执行完 mov ebp,esp 后的ebp的值)  接下来单步运行程序。来到地址0x275c89da地址出,查看栈空间,在此处特别要谨记函数调用中的三个参数(分别是:0x127b18 0x0c4e06b0 0xc

结合着汇编指令很容易理解上图中的内容。接下来进入此函数。
 
如上图所示 地址 27589df是此函数的返回地址,0x127b2c是上层函数ebp的值。此层函数 ebp = 0x127af8.继续单步运行,
当执行完地址:0x 275c8783处的指令后,观察前后栈区数值的变化如下图所示(此函数的作用是从源地址:0xbd706b0处向0x127af4处读取四个字节内容):  

此处的变化仅仅是地址 0127af4地址处的值由原来的 275b2480->0x0000000c  程序运行到地址0x275c878d处时,此函数的第三个参数与地址0x127af4处的值进行比较。如下图所示:    

接下来继续单步运行来到堆内存申请函数出,可以观测出申请的内存大小是0xc字节。并且函数的返回句柄保存在 eax中(此处需要谨记)
 
接下来继续单步执行到地址:0x275c87b5地址出 此函数作用仍然是从poc的文件内容中读取0xc字节的数据到申请的堆区内存中。当执行玩以后如下图所示表明此时:

接下来继续单步运行如下图所示:  

接下来直接执行到地址0x275c87cb地址处。  此时观察edi esi ecx的值,如下图所示:

从上图中观察出 edi = 00127b8 (即函数的第一个参数) esi 的值就是申请堆内存时返回的句柄。ecx = 3  是shr ecx,2后的值,通过向上翻看指令可知,ecx 值来自edi 来自函数调用中第三个参数的值。

至此可以得到的是在溢出函数的被调函数中(也就是从地址0x275c89c7开始的函数中),当在栈中申请0x14字节内存后(内存地址是0x127b18-127b2c) 当在地址0x275c89da处第一次执行函数的时候,在栈区申请的0x14字节的内存已经用掉啦0xc字节,并且进行了复制如下图所示:
地址275c89da 此函数的作用是:间接利用堆内存,从poc文件中复制内容到栈区中。复制内容的多少由函数的第三个参数决定。(这个是重点)  

接着从地址0x275c89df开始继续进行分析单步运行程序:

从地址0x275c89df 到地址 275c89f7 处,其中两条cmp的比较指令尤为重要,决定啦是否执行esp。并且第二条cmp指令的值决定啦在0x275c8a05处第三个参数的大小。以上分析可知,0x127b18 - 127b2c中间内存的值是从poc样本中复制出来的。因此只需构造一下即可满足此两个条件。
接下来进入275c8a05地址出进行分析。(其实和地址 275c89da地址处的分析一样,只不过是数据发生啦变化)  进入函数后,如下图所示:

如上图所示:在函数返回地址后面紧跟的三个数值即为函数参数。
当执行到0x275c8786地址处的时候,如下如所示:

如上图所示,在地址275c8783地址处的函数调用中,成功读取到啦四个字节的值(0x127af4= 0x00008282)  
当执行完0x275c879e处指令后记下返回值 eax= 0x04ed9008,接着继续执行到地址:275c87b8地址处,如下图所示:

地址275c87b5地址出的指令作用是向堆区进行复制0x8282字节的内容,源文件来自poc样本,地址是(bd706bo)  
接下来直接执行到地址 0x275c87cb地址出,如下图所示:

如上图所示一目了然啦已经很,ecx = exc>>2 == 20a0  edi仍然是参数,esi仍然是堆区首地址。此时查看堆区内容如下图:

此时应该很清晰啦吧。当执行275c87cb地址出的指令的时候,eip肯定会被poc样本控制。

ida分析起来就比较简单啦,直接将mscomctl.ocx拖进ida 查找到 0x2785c89c7地址出的函数,如图所示:  
查看伪代码

直接进入溢出函数查看伪代码:

集合这汇编指令是不是很是一目了然

mscomctl.ocx 0x275c89c7中,

此处的判断条件存在错误  不应该是 >=8 而是小于等于 8


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 6978
活跃值: (4197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2017-5-26 19:01
0
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
3
样本在哪?上传到论坛一下呗
2017-5-26 22:27
0
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
4
感谢上传了样本!
2017-5-28 21:01
0
雪    币: 1441
活跃值: (299)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
wyfe 感谢上传了样本!
不好意思,没能及时回复。共同进步,互相学习》

2017-5-29 12:50
0
雪    币: 1441
活跃值: (299)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
MaYil 感谢分享
共同进步,互相学习
2017-5-29 12:50
0
游客
登录 | 注册 方可回帖
返回
//