CVE-2012-0158浅析-word栈溢出漏洞

来源:互联网 发布:迪联软件 编辑:程序博客网 时间:2024/06/07 02:15

本文转载自CVE-2012-0158漏洞分析
mscomctl.ocx是Windows公用的ActiveX插件控制模块。Microsoft Office多个版本中的MSCOMCTL.OCX的ListView、ListView2、TreeView和TreeView2 ActiveX控件中存在漏洞,远程攻击者可利用该漏洞借助触发系统状态内存破坏的特制web站点、Office文档或.rtf文件。用IDA Pro打开C:\WINDOWS\system32目录下的MSCOMCTL.OCX,双击左侧的Function Name窗口中的sub_275C89C7函数和sub_275C876D函数,按下F5键查看它们反汇编出的C代码。
这里写图片描述
这里写图片描述
sub_275C876D中依次调用了HeapAlloc、qmemcpy和HeapFree,关键在于 qmemcpy((void *)a1, lpMema, dwBytes);它的作用就是将dwBytes指定的字节数从lpMema中复制到a1中。sub_275C89C7第一次调用sub_275C876D读取了12个字节,如果读取的这12个字节前4个字节是0x6A626F43h(也就是图中以十进制方式显示的‭1784835907‬)并且需要继续读取的字节数大于8则继续读取。这里本来应该是小于8才继续读取,但是却错写成大于8才继续读取。这个字节大小是可以控制的,所以当传递比如0x8282时,那么程序就会读取样本相应位置可控的0x8282字节到堆空间,复制到栈上时进而覆盖掉函数的返回地址,执行shellcode。‬这是从网上找到的POC。操作系统版本为XP SP3,Office版本为Standard Edition 2003。
这里写图片描述
打开POC,word立即闪退并弹出计算器。
这里写图片描述
再一次打开这个样本,发现程序报错。所以在测试前记得先备份,因为下面我们多次要打开这个样本。
这里写图片描述
用Windbg附加word调试。因为程序弹出了计算器,所以肯定会调用WinExec函数,使用bp kernel32!WinExec命令下断点。
这里写图片描述
现在把样本拖到word中打开,程序断在WinExec入口点。使用dd esp命令查看堆栈情况,再使用da xxxxxxx命令查看WinExec的参数。
这里写图片描述
到这个目录看一下,发现a.exe其实就是一个计算器,shellcode把系统的calc复制到这个目录再运行它。
这里写图片描述
WinExec的返回地址是00127dca。使用kb命令打印堆栈信息。
这里写图片描述
重新调试,再次载入样本,在MSCOMCTL!DllGetClassObject+0x41cc0处下断点。
这里写图片描述
使用u命令查看附近的命令。
这里写图片描述
断在call的上一句,kb发现这一层函数的返回地址是0x275e701a。
这里写图片描述
再次使用u命令查看附近的命令。
这里写图片描述
执行两次p命令,p命令的含义是单步步过,不进入函数的调用。
这里写图片描述
为了确认这个时候溢出是否已经发生,在内存中搜索shellcode使用的万能跳转指令0x7FFA4512。在经典的栈溢出模型中,通过覆盖函数的返回地址来控制程序执行流程时通常会将返回地址覆盖为0x7FFA4512,这个地址是一条JMP ESP指令,在函数返回时就会跳转到这个地址去执行,也就是执行JMP ESP,而此时ESP刚好指向栈上布置的shellcode,于是就执行了shellcode。
这里写图片描述
windbg中使用s -a 00000000 001fffff xxxxxxxx命令在内存中00000000~001fffff的范围内搜索ASCII字符串xxxxxxxx。E�是十六进制1245FA7F的ASCII表示方式,可以在UltraEdit中利用十六进制模式进行转换。
这里写图片描述
在00127b64 和00129c3e处找到了万能跳转指令。
这里写图片描述
在memory窗口中输入00127b64,发现了万能跳转和shellcode。
这里写图片描述
在call调用MSCOMCTL!DllGetClassObject+0x41a29之前这里还没有被shellcode覆盖,那么溢出就发生在这里。一直用p命令单步执行下去,来到了jmp esp指令处,接下来就会跳转到shellcode。
这里写图片描述
继续单步执行,弹出了计算器。
这里写图片描述

0 0
原创粉丝点击