吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 38012|回复: 48
收起左侧

[漏洞分析] CVE-2010-3333漏洞分析与利用(包括POC构造)

  [复制链接]
leonchan 发表于 2014-9-8 09:37
本帖最后由 leonchan 于 2014-9-8 14:53 编辑

许久之前分析过office word的一个漏洞(CVE-2010-3333),并尝试着构造了该漏洞的POC,在分析的过程中做了文档记录,废话不多说,开始step by step。仅供学习交流。注意:漏洞的相关概述可以自己去百度,这里没有细谈。
POC构造思路及方案
1)调试工具的选择
由于这是个栈溢出漏洞,所以选择windbg来作为调试工具。
2)思路&步骤
第一:必须得构造一个具有pFragments属性的文档。就把它命名为crash.doc文件吧;
第二:向crash文件中填入特殊字符,当然填入的字符类型也是有讲究,一般情况下在内存中能够方便查看就行。字符的数量也应该是由少到多慢慢增长。每做一次填充都应该仔细观察写入内存情况;
第三:设法让你构造的字符能够覆盖EIP,这样的话就能控制程序的流程了。
第四:选择合适的跳转地址。
第五:填入shellcode,让EIP跳至shellcode处;
在这过程中一定要注意记录各种数据,有时候甚至要做出部分流程图。
制作过程
构造crash文件
毫无疑问第一步得先构造一个能触发这个漏洞的crash文件。既然是RTF文档绘画属性这块出了问题,那就有的放矢,按照这个格式构造一个名为crash的文件,文件格式以及信息如下。
{\rtf1{}{\shp{\*\shpinst{\sp{\sv 1;1;4141414141414141414141414141}{\sn pfragments}}}}}
在这里为了方便起见,将每个元素的字节数设为1,数组数量同样设为1。后面的数组元素是跟溢出相关的数据,首先尝试将这些数据设为若干个A,十六进制表示为“41”。
利用crash文件寻找漏洞触发点
设置完毕后打开crash文件,程序崩溃,报告信息如图4.2.1所示。
4.1.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA17F.tmp.png
4.2.1 程序崩溃
很好!!运气不错,很少的字符串就能让程序崩溃。记录下报告信息,崩溃原因是EIP指向地址为0x00000000地方,当然这个地址程序是不存在的,所以自然崩溃。好了,既然程序崩溃,但是我所关心的是构造的数据有没有填进缓冲区,带着疑问用windbg打开这个crash,查看崩溃细节,如图4.2.2所示。
4.2.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA18F.tmp.png
4.2.2 崩溃细节
明显的看到了构造的数据写进内存了,好像没有全部写进去(因为构造的数据是14A,这里只写进去8个,还有6A没有写进去,带着这个疑问继续往下看);程序的EIP没有被构造的数据填充,查看这四周数据,可以看到很多00,应该是被这些00覆盖了。继续扩大crashA的数量。
{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;41414141414141414141414141414141414141414141414141414141}{\sn pfragments}}}}}
同样载入windbg查看细节,验证一下,如图4.2.3
QQ截图20140908143648.bmp
QQ截图20140908143805.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1A0.tmp.png
4.2.3 堆栈细节
令人惊喜的发现构造的数据成功写入了EIP,但是有一点跟上面一样,那就是前6A依旧没有被写进去。同样为了确定EIP是构造的数据写进去的,可以将数据继续覆盖下去,这次数据换一下,将前6A不变,后面采用一些B来填充。
{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;4141414141414242424241414141414141414141414141414141414142424242}{\sn pfragments}}}}}
载入windbg再次验证下,如图4.2.4所示。
4.4.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1A1.tmp.png
4.2.4 堆栈细节
从上图可以得到三个信息:1)函数的返回地址保存在0x00123dd4中;2)前6A确实没有写进缓冲区,说明这些数据另作它用,推测可能是某些设置需要(再议)。3esp的地址是0x00123dec,这个地址同样很重要,因为如果使用jmp esp作为跳板的话,最终是要跳到shellcode区的,而shellcode就是覆盖在esp之后的。
布置shellcode
有了上述的分析以及推导,现在就开始布置shellcode到缓冲区,这里利用jmp esp作为跳板,在XP下的万能跳转地址是0x7ffa4512,将7ffa4512填入地址为0x00123dd4中,覆盖原来的返回地址。因此在crash中应当这样布置:
{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;41414141414142424242414141414141414141414141414141411245fa7f}{\sn pfragments}}}}}
这里先验证一下jmp esp地址是否能够成功跳至esp0x00123dec)处,同样载入windbg观看。如图4.3.1所示。
QQ截图20140908144132.bmp
QQ截图20140908144250.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1B1.tmp.png
4.3.1 堆栈细节
从上图可以看出已经成功跳转到esp处,那么接下来要做的就是在esp之后布置shellcode,先从0x00123dd8处覆盖到0x00123deb处,这段内存用A来覆盖;0x00123dec之后就开始要布置shellcode了,为了方便调试不妨先用nop90)指令来填充。构造的crash数据如下:
{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;41414141414142424242414141414141414141414141414141411245fa7f41414141414141414141414141414141414141419090909090909090}{\sn pfragments}}}}}
载入windbg查看,如图4.3.2所示。
QQ截图20140908144358.bmp
QQ截图20140908144406.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1B2.tmp.png
4.3.2 堆栈细节
哦哦。。。令人始料未及的事情发生了,虽然构造的数据写进内存中去了,然而原本应该是执行完jmp esp之后指令跳转到0x00123dec执行后面的nop指令,但是结果令人很遗憾,程序不知道跑哪里去了,现在的EIPESP都不是意料之中的值。
在前面一步明明是可以控制EIP的,为何这里却不可以。幸好这里我做了记录,对比一下图4.3.1和图4.3.2,这里不同的就是在0x00123dd80x00123deb之间用A来填充了,而在图4.3.1中这段数据是00填充的,难道是这个影响?不妨试一下,将这段数据换成00试一下:
{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;41414141414142424242414141414141414141414141414141411245fa7f00000000000000000000000000000000000000009090909090909090}{\sn pfragments}}}}}
载入,如图4.3.3所示。
4.7.bmp
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1C3.tmp.png
4.3.3 堆栈细节
果不其然,就是这段内存造成的,重新看到了熟悉的EIPESP,这里已经执行完nop指令了,EIP停在0x00123df4处。
在这里我后面仔细调试了一下,这段内存并不是都要求是00,只要在地址0x123de8处(也就是最后4个字节)只要全是00一样可以得到同样的效果。因此在布置shellcode的时候注意将0x00123de8处的内容要填为00 00 00 00猜想这个地方可能作为一个判断条件,不然怎么解释只有当这块内存为0才能跳至esp处,当不为0的时候作其他处理,而这个处理是不受控制的。
好,现在已经能够控制esp的跳转了,意味着EIP被劫持了,接下来就是填充真正的shellcode来实现漏洞的利用了。
漏洞利用
现在可以将构造好的shellcode填入上述nop指令之后了。直接打开crash文件查看利用效果,如图4.4.1所示。
QQ截图20140908144808.bmp

file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wpsA1C4.tmp.png
4.4.1 利用结果展示





免费评分

参与人数 4热心值 +4 收起 理由
changjiang + 1 谢谢@Thanks!
a110world + 1 热心回复!
arryboom + 1 想赞一下结果恩错了踩了,楼主原谅我,膜拜.
505209022 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zxcasd493 发表于 2016-12-5 10:49
现构造的数据成功写入了EIP,但是有一点跟上面一样,那就是前6个A依旧没有被写进去。同样为了确定EIP是构造的数据写进去的,可以将数据继续覆盖下去,这次数据换一下,将前6个A不变,后面采用一些B来填充。


{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;4141414141414242424241414141414141414141414141414141414142424242
zxcasd493 发表于 2016-12-5 10:47
现构造的数据成功写入了EIP,但是有一点跟上面一样,那就是前6个A依旧没有被写进去。同样为了确定EIP是构造的数据写进去的,可以将数据继续覆盖下去,这次数据换一下,将前6个A不变,后面采用一些B来填充。


{\rtf1{}{\shp{\*\shpinst{\sp{\sv1;1;4141414141414242424241414141414141414141414141414141414142424242
头像被屏蔽
a1014 发表于 2014-9-8 09:46
 楼主| leonchan 发表于 2014-9-8 09:47
奈何图片超过了512KB,没办法传不了啊
 楼主| leonchan 发表于 2014-9-8 09:48
a1014 发表于 2014-9-8 09:46
图片坏了,重新上传一下吧

图片大了,传不了,我直接就发了个链接了。
 楼主| leonchan 发表于 2014-9-8 14:55
@Hmily 版主大大,这个图片限制在512k真的好麻烦呐

点评

囧,没办法区分图片和附件,之前是挺大的,老有人传大附件就缩小了,我再看看吧,可以把图片重新转换下格式能小很多。  详情 回复 发表于 2014-9-8 19:06
Hmily 发表于 2014-9-8 19:06
leonchan 发表于 2014-9-8 14:55
@Hmily 版主大大,这个图片限制在512k真的好麻烦呐

囧,没办法区分图片和附件,之前是挺大的,老有人传大附件就缩小了,我再看看吧,可以把图片重新转换下格式能小很多。
 楼主| leonchan 发表于 2014-9-8 20:09
Hmily 发表于 2014-9-8 19:06
囧,没办法区分图片和附件,之前是挺大的,老有人传大附件就缩小了,我再看看吧,可以把图片重新转换下格 ...

好的,我后面将一张图片截成两半,分开传的。

点评

现在应该可以了,我调整到1M了。  详情 回复 发表于 2014-9-8 20:56
Hmily 发表于 2014-9-8 20:56
leonchan 发表于 2014-9-8 20:09
好的,我后面将一张图片截成两半,分开传的。

现在应该可以了,我调整到1M了。
Hmily 发表于 2014-9-8 20:58
软件调试区终于迎来新的技术文章,加精鼓励,期待更多精华分享。
 楼主| leonchan 发表于 2014-9-8 21:04
Hmily 发表于 2014-9-8 20:56
现在应该可以了,我调整到1M了。

好的,谢谢啦
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 20:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表