CVE-2010-3333
- OS: Windows xp sp3(x86) 简中
- 虚拟机:VMware Workstation 14.1.1
- 调试器:windbg(6.11.0001.404)
- 静态分析:IDA Pro 7.0
- 漏洞软件:Office Word 2003 sp3
这是第一次使用windbg调试cve,windbg对我这种初学者来讲非常难用,尽管引起了诸多生理不适,但还是很高兴能完成这么一项工作。
调试开始前,先从msf上获取POC。
打开word之后使用windbg附加上去,之后打开msf.rtf。
可以看到windbg提示了一个访问冲突的异常并将程序断了下来,并且断下来的位置在mso.dll中的一处重复拷贝指令处,而且观察此时edi及ebp的值,很明显地发现这里发生了栈溢出,并且溢出的数据非常大,覆盖到了0x130000处,通过!address edi
命令发现,此处是一个只读地址,数据复制到了这里导致了访问冲突
现在使用栈回溯来寻找一下引发漏洞的函数位置,重新打开并附加一下word,使用bp 30e9eb88
下断。
这里成功断了下来,之后使用kb
进行栈回溯
使用ub mso!Ordinal753+0x306e
查看调用函数的指令(主要是看被调函数的地址)
重新打开word并附加,在0x30f4cc5d处下断,之后开始单步调试(单步过程较长,可跳过)
|
|
通过上面调试时ecx的值,我们发现了待拷贝数据的大小0xc8ac,在poc中也发现了这个数值
此时通过db esi
命令即可查看待拷贝的数据
|
|
观察ascii码发现,待拷贝的数据正好紧跟着0xc8ac。
通过《漏洞战争》上的描述,0xc8ac是pFragements属性值的大小,而后面就是属性值了。漏洞成因书上也讲得很明白,是由于Word的RTF分析器在解析pFragements属性值的时候没有检验属性值的大小,从而形成了一个栈溢出漏洞。(可能解析其他属性值的也有类似的问题存在?)
这里计算下需要多少字节的数据可以溢出到返回地址
|
|
通过这里的计算再加上ebp的四字节大小,我们需要0x14个字节就可以溢出到返回地址了,手动构造poc如下:
重新加载附加,可以看到eip被成功劫持
之后exp的编写一直没完成,以前接触漏洞利用都是在ctf中的,都是linux的,Windwos的还不是很了解,希望以后把这个坑补上。