对CVE-2012-0158的分析
漏洞分析环境与工具
漏洞分析环境:Window 7 专业版(32位)
带有漏洞的软件:office 2003 sp3
工具:OllyDbg、IDA Pro
漏洞复现
打开office2003使用OllyDbg进行附加,运行测试文件触发漏洞如图所示。可以看见,EIP指向了0X41414141处,发生了缓冲区溢出漏洞。
分析漏洞
通过分析溢出点附近的堆栈,我们可以找到一个地址0X275C8A0A,可以看出这个地址是MSCOMCTL模块中的地址。因为溢出点附近的堆栈中保存了这个地址,所以我们可以判断漏洞的溢出点就在这附近。
对函数下断点,再次运行OllyDbg,单步调试。当单步步过0X275C876D这个函数的时候,堆栈发生了变化,返回地址被0X41414141覆盖。
用IDA Pro打开MSCOMCTL.ocx,定位到0X275C876D这个地址,利用F5查看原码。
可以发现当程序调用MSCOMCTL.275C876D这个函数的时候传递的第三个参数,和函数内部的局部变量进行比较,如果相等,那么进行内存空间的拷贝。从上面的图中可以看出,局部变量通过调用一个函数进行赋值,猜想比较的应该是word文件的大小是否匹配。打开010Editor导入测试样本,利用搜索功能搜索传进来的参数(具体的值可以通过OllyDbg动态调试的时候获取)。发现有两个一样的值,通过改变其中某个值得大小进行验证。最终可以得出第一个是传进来的函数参数,第二个是局部变量。
漏洞成因
综上可以得出漏洞成因是在读取数据的时候,读取的长度和验证的长度都在文件中,且可以人为修改,进而出发缓冲区溢出。
漏洞利用
编写shellcode,运行结果如下图所示。