ღ Miranda

CVE-2012-0158 MSCOMCTL.ocx 栈溢出分析

前言

CVE-2012-0158出现在MSCOMCTL.OCX,微软Office在处理MSCOMCTLListView控件的时候的失误,导致攻击者可以通过构造恶意的文档执行任意代码。

环境

系统: windows XP SP3
office版本:2003 11.5612.5606

调试分析

打开poc.doc,程序崩溃在0x41414141:

栈回溯发现什么也没有,也无法切换到上一层栈帧,用immunity debugger调试发现此时的栈情况为:

alt+e切换到模块视图,右键选择Analysis all modules,等待所有模块分析完成再看这段栈:

发现275A273D是一个属于MSCOMCTL的地址,很可能就是触发崩溃函数的返回地址。用IDA加载MSCOMCTL.OCX,位于sub_ 275A26FA中:

这个模块是在加载.doc文件时才动态加载的,这里可以用windbg对这个模块设置加载断点,然后运行,打开poc.doc:

在加载模块时会断下来,这时就可以在275A2738处的call下断点了,设好断点后继续运行就会断在275A2738处。

sub_ 275A26FA返回时返回到了0x41414141:

看一下MSCOMCTL!DllGetClassObject+0xb1b9这个函数:

注意这里有两条rep movs指令,那么很可能就是这里导致了栈溢出覆盖了sub_275A26FA的返回地址。再次调试,看看这里是怎么复制的。

这里可以知道复制大小在ecx中,复制是以dword方式复制的,所以ecx要除以四,这时用t命令单步,同时注意观察目标栈上的地址00121700的内存,复制了几次后发现41414141被填入了0012170c处,这时栈底为001216d4,单步到这个函数返回,栈底变为00121708:

这里就知道了,覆盖了sub_275A26FA的返回地址。

回溯一下edi的来源,有一句mov edi,[ebp+8],也就是将函数的最后一个参数赋给edi,对应调试:

eax的值就是将要赋给edi的值00121700,回到sub_275A26FA发现eax来自于lea eax,[ebp-14h],也就是eax=esp-0x14,而在275A2738处的call之前,esp又加了0xc,这样栈上只剩下0x8的空间,而实际复制的大小为000020a0(dword),导致了溢出。

发表评论

电子邮件地址不会被公开。