0 简介
软件名称:Microsoft Word
影响范围:2007-2016
影响平台:Windows
漏洞模块:wwlib.dll
分析环境:win7+office2010
样本:b2ae500b7376044ae92976d9e4b65af8
1 样本静态分析
拿到样本以后,先不着急去动态加载去分析,我们先分析一下样本,看看能不能获取到一些有用的信息。
用oletools中的rtfobj.py 解析一下样本,
有三个对象,第一个没有名字,第二第三个看起来是同一类型的,而且还知道了他们在文件中的位置。通过命令rtfobj.py -s all 将他们分离出来,逐个看一下
1.1 Object 0
id为0 的对象看不出什么东西来,我们还是去样本文件中它所在的位置去看一下
很明显能看到一个clsid,关于clsid我们简单说一下,
因为有很多组件是会被多个程序使用的,而这些组件在不同计算机中存储的位置也是不一样的,为了解决这个问题,微软便提出了用CLSID这么一个16字节的数来表示。在注册表HKCR\CLSID\{......}主键下,便存储着CLSID,每个CLSID下的LocalServer32(DLL组件使用InprocServer32) 中保存着程序路径名称。CLSID 的结构定义如下:
去注册表里面找一下D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731这个值,很尴尬,没有找到。在win7和win10里面都没有这个值,最后在xp上找到了。
这里调用这个msvbvm60.dll是干嘛用的呢?通过这篇文章我们知道,原来通过未开启aslr的模块来绕过aslr。那么问题来了,在xp上默认是不开启aslr的,所以有和没有没有太大的区别;在win7和win10上虽然默认开启,但是注册表中没有这个值,岂不是就没有作用了么(事实也证明了这一点,当我打开样本时,用火绒剑观察winword.exe时并没有发现有加载这个dll)。那么为什么不用一个更加通用化的dll呢?
1.2 Object 2
第二个跟第三个对象看起来是一个类型的,都是word对象。我们把他们解压来看一看
通过[Content_Types].xml可以看出,样本中插入了40个activeX对象:
我们去Package~\word\activeX目录中看一下插入的对象是什么,在该目录下有一个bin文件和40个xml文件,这四十个xml文件都是一样的:
在Package~\word\activeX\_rels目录下可以看到这些xml文件的对应规则,40个rels文件中的内容也都是一样的
是将这些xm文件都指向activeX1.bin文件中,那么主要内容就是这个activeX1.bin文件了,我们看一下这个bin文件,发现里面有一块块重复的数据,大致是(A+B+C),其中
每块大小0x1000,共有512块,这就很明显了,是用于堆喷的,C是shellcode部分。我们记下这里的几个地址72980b2e 729440cb 729440cb 088883ec,看后面能不能遇到。关于shellcode部分,可以用在线网站查看反汇编代码和流程。
再看一看第三个对象,
存在乱码字符,我们还是看一下其二进制内容:
其乱码部分是E8 A3 AC E0 A2 88,与第二个对象中的几个地址好像都沾不上边。关于样本的分析就到这里,我们大致可以总结出:样本文件中有三个嵌入的对象,其中第一个对象用于绕过aslr(虽然可能并没有什么作用),第二个对象是用来堆喷的,那么第三个对象想来应该就是结合堆喷实现漏洞利用的。我们在后面的分析调试中可以重点关注第三个对象相关的信息。
2 调试分析
我们用windbg附加WINWORD.EXE,然后打开exp,程序断在这里:
通过反汇编窗口可以看到崩溃处附近的代码:
显然,eax的值在call wwlib!DllGetClassObject+0x42d4 (674698b0)被修改,我们在该处下断点跟踪看一下,重新加载样本
如期而断
程序断下后,我们跟进这个call看一下,
该处代码其实就是:
很明显,这里是一个“查表”的操作,多次跟踪可知,ecx指向的地址中存的值是固定的。所以上面的式子也可以转换成:eax*0x5c + 0x10 + [ecx],我们就可以通过这个式子去探探这个“表”里面具体是什么内容,
在之前调试时,触发崩溃时eax=4,当eax为4时,我们可以看到之前静态分析时的字符,但是其中乱码部分是088888ec,这串数在实现堆喷的对象中有用到,但是与嵌入的第三个对象有区别,第三个对像中的是E8 A3 AC E0 A2 88。那么问题来了,为什么不一样呢?我也不知道。根据这篇文章里面的测试代码可以知道,是由于编码的问题,新技能get。而eax=3和eax=5时分别指向OLEObject和idmap。根据之前静态分析的结果,这两者之间的是font。所以这个函数的功能就是在解析这些标签。
Ok,我们走出这个函数,看一下那一串+44h的赋值操作是什么,
看起来挺绕,简化一下就是
也就是前两行就完事儿了,跟一下
又见到这串字符串,而取出来的值是088888ec,说明这个地址应该就是构造的地址。样本崩溃处的代码是:
mov ecx,dword ptr [eax],其下一行是call dword ptr[ecx+4]
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-5-14 09:58
被vlinkstone编辑
,原因: