首页
社区
课程
招聘
[原创]MS10-087从漏洞补丁到POC
发表于: 2014-12-31 12:43 8533

[原创]MS10-087从漏洞补丁到POC

2014-12-31 12:43
8533


安装完Office 2003 SP3后,Mso.dll的版本是11.0.5606.0,与漏洞补丁的11.0.8329.0差距非常之大,这为我们逆向对比补丁程序带来了很大的困难。于是我找到了MS10-036的补丁程序,这个补丁也包含2个文件,如下图:




现在Mso.dll的版本11.0.8324.0与MS10-87的补丁版本11.0.8329.0比较接近了。
接下来我们从补丁中提取DLL,假设你下载后的文件名称为Office-KB.exe,在命令行中通过Office-KB.exe /c提取出安装文件,如下图:



Office2007版本前的补丁程序提取过程比较蛋疼,还需要解压MSO.msp,这里有一个提取工具:
http://www.windowswiki.info/2009/02/19/how-to-extract-msumspmsiexe-files-from-the-command-line/
用法:msix MSO.msp /out C:\patch,得到CAB后,通过解压缩就可以得到补丁文件了。

得到了11.0.8324.0(未修复版本)和11.0.8329.0(修复版本)的MSO.DLL后,我使用了BindDiff工具来查找两个DLL的差异。尽管两个DLL的版本号差异不大,但是这个接近12M的DLL比对起来,仍然有非常多的差异函数:



在至少100多个函数当中去定位漏洞所在代码实在像大海捞针一样,此时我考虑先从构造一个非法的RTF格式数据来触发一些异常,获得EIP地址后再来补丁程序中查看能否进一步获得一些信息。
关于RTF规范可以参考地址:http://www.doc88.com/p-33279717171.html
规范中介绍pFragments属性的值时有这样一段描述:

 



既然文中提到“每个元素的字节数可以为2、4、8”,为了触发异常,我绝对不会老实的按要求使第一数字为2、4、8,于是构造了一个看似非法的RTF格式的数据:
{\rtf1{}{\shp{\*\shpinst{\sp{\sn pfragments}{\sv 1;1;11121314151617181920}}}}}
保存为,运行,崩溃!




我使用Windbg去调试,得到的崩溃信息如图:



可以看到EIP指向0x00000000,观察寄存器信息哪些可以被我们利用,看到EDX=20191817,这个不是我们填入RTF的数据吗,但是这里有一个疑问,为毛填入的数据,没有转变为ASCII,反而以十进制的形式表示。先不管这个,查看堆栈:



到了这里我也没有好的办法能迅速定位到事故EIP,查看堆栈的话,因为EIP已经改变为0x00000000,现在的问题是如何定位溢出的EIP,我想到的方法是,沿着堆栈向内存高地址查看堆栈内的函数调用留下的EBP和返回地址,BP返回地址,重复从崩溃信息中一点点靠近溢出现场(本人知识有限,如有更好的方法不吝赐教!)。因为是栈溢出,一旦溢出数据破坏了返回地址,程序返回会立刻产生异常。

于是看ESP=0x00123808,到这个栈地址的附近去看看内存信息



并没有发现我们填入的数据,以及有用的信息,去远一点的地方再看看




这里有一个0x0012516c,很像栈地址对不对,后面的0x3006f94f就是堆栈内其他函数的返回地址,重新打开Windbg,bp 0x3006f94f,用World打开RTF




程序断在了这里,这里的ESP距离事故现场的ESP 0x00123808还是有一点距离的。
因为现在进程进入了调试态,所以最后溢出时候的栈地址可能和现在的0x00123808不同。
抱着一点点耐心,经过N次崩溃及N次重复下断点,最后我找到了使堆栈溢出函数:




代码反汇编如下:




继续步进,来到0x30e97c06的地方:




此时ecx=0x00000585(已经除过4),原地址esi为=0x09c6000c,目的地址edi=0012aa30,从地址来看edi是在栈中的一个缓冲区,再看当前栈帧的栈底ebp=0x0012aa40,这个缓冲区用C语言表示的话char buffer[0x10],也就是不到0x10字节的大小,但是复制的数据长度却是0x585 * 4,这条指令执行完,edi的值早就高于ebp了,正是这个地方缓冲区溢出,同时可以看到EDI的值是从作为函数参数传递过来的,我们去上一个函数看看。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-2-6 19:02 被kanxue编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这样的分析,我什么时候才能够做到啊。唉~
2014-12-31 12:46
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
学习一下。
2014-12-31 12:57
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
4
给转正了吧,
2014-12-31 13:42
0
雪    币: 283
活跃值: (74)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
祝早日发现0DAY,
2014-12-31 16:39
0
雪    币: 62
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
软软的问下,发现的过程与补丁有什么联系?
2015-1-7 20:12
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
7
, 通常情况,有些人会通过打补丁前和打补丁后的文件对比来定位官方Patch过的地方,然后 什么什么的 云云 ~~~
2015-1-7 20:16
0
雪    币: 62
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
了解了,
2015-1-7 20:54
0
雪    币: 62
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
了解了,但是这篇好像跟补丁没什么关系
2015-1-7 20:55
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
10
是啊,存在差异的函数太多了...楼主不好直接切入,就换了个切入点
2015-1-7 21:01
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
11
就在论坛交流吧... 挺好的...  
2015-1-7 21:06
0
雪    币: 62
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
三克油
2015-1-7 21:08
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
13
2015-1-7 21:20
0
雪    币: 62
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我可以问下,你们是怎么定位到 pFragments属性 的吗?貌似这才是关键。。。
2015-1-7 21:39
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
15
俺要去一家安全公司了,去做个实习也不错,至少有时间研究这些,还能跟着牛人学习下技巧,感觉不错!   最近不见你QQ了
2015-1-7 21:50
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
16
,挺好... 偶那个QQ掉了... 又申请了一个新的...   你那个群号多少来着?
2015-1-7 21:51
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
17
分析的很好,以资鼓励
2015-1-8 08:19
0
雪    币: 271
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
是啊  楼主应该讲讲如何定位到pFragments属性的
2015-1-8 10:11
0
雪    币: 292
活跃值: (815)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
也许是这个漏洞说明直接说了pFragments属性有问题所以楼主直接就定位到了吧,如果楼主是自己挖掘的,那可以讲讲过程。。。

楼主帖子上面说那个edx=20191817,在设定pFragments值的时候就是十六进制的形式吧,不存在ASCII或者十进制的问题?难道是笔误?
2015-1-8 13:55
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
我也认为前面的补丁提取找到差异的地方,到构造一个奔溃的poc,这里跳跃太大,缺少承上启下。
2015-1-9 08:33
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
21
你加我新QQ吧 以后 去安全公司就用这个了  171001967
2015-1-9 13:23
0
雪    币: 51
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主说“前面的11、12、13、14,应该也是被WORD解析掉了”,楼主不应该这么去猜测,虽然楼主你的猜测被证明是对的。实际上,前面这几个数字对能否触发漏洞至关重要,这几个字节在什么时候解析的一定要分析清楚。
2015-7-4 20:43
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了!
2015-7-7 14:15
0
雪    币: 26
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
很详细 感谢
2015-8-10 04:44
0
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
25
楼主是从结果入手倒着分析的,学习了
2016-8-13 19:32
0
游客
登录 | 注册 方可回帖
返回
//