类别:栈溢出,fileformat类别漏洞
描述: This module exploits a stack-based buffer overflow in the handling of the ‘pFragments‘ shape property within the Microsoft Word RTF parser.
参考资料:《Metasploit魔鬼训练营》p276-p286
利用的是exploit/windows/fileformat/ms10_087_rtf_pfragments_bof模块,它会生成一个.rtf文件,在靶机中打开后会执行payload。
我这里的payload是弹出计算器,成功实现!
MS10_087漏洞原理分析
用OllyDbg打开winword.exe,按f9运行。在word中打开测试文件ms10087.rtf,OllyDbg捕获异常:
出错的原因是什么呢?此处访问内存中0x00130000地址处,而通过alt+m可知0x00104000到0x0012ffff才是当前进程的栈空间,可知此次内存访问越界了。
根据经验,越界一般是想触发异常,让程序执行seh,那么seh应该在之前被覆盖了。
在OllyDbg标题栏可以看到此处的模块是mso,用IDA打开mso.dll分析。
但是ida反汇编似乎要花好久时间,我一个午觉睡醒了还卡卡的在分析,就先不弄这个ida的了。而且这一步的目的也只是分析出错处所在的函数入口,以查看栈中对应此函数的参数。
这里我们只要在函数入口处0x30ED4406(这里的地址为什么又固定了?而且还有很诡异的一点就是:通过ctrl+g可以来到0x30ED4406处,但是一移动这个地址就消失,本来push edi的机器码57和其他机器码组成了这里的add指令,不知道为什么两边的兄弟要这么强势。。)
源地址为0x1A54000C,目的地址为0x00123E98,长度为0x322b*4=0xC8AC个字节。目的地址离栈底0x0012ffff的距离0xC167少于复制长度,造成溢出,引发异常。
异常之后自然就是执行SEH,可是我这里被覆盖的SEH却是指向0xBDB98B85,可是这个地址并不能访问!
在这里,我是先在OllyDbg中打开winword.exe,然后再在word中打开ms10087.rtf。所以我想会不会是这里出问题,就另外不通过ollydbg直接打开winword.exe,然后打开ms10087.rtf,结果出乎意料,程序并没溢出计算器,而是直接关闭了。
但是直接双击打开ms10087.rtf还是能成功溢出的。
重新看了看书,说的挺模糊的。说是让修改下mso.dll,设置软断点。重启word,ollydbg就会加载进去。(未完待续。。)