CVE-2012-0158分析
这个实验参考了漏洞战争和http://blog.****.net/qq_35519254/article/details/53103931。
1 基本信息
rtf文件的开头如下
{\rtf1
{\fonttbl{\f0\fnil\fcharset0 Verdana;}}
\viewkind4\uc1\pard\sb100\sa100\lang9\f0\fs22\par
\pard\sa200\sl276\slmult1\lang9\fs22\par
{\object\objocx
{\*\objdata
01050000020000001B0000004D53436F6D63746C4C69622E4C697374566965774374726C2E32000000000000000000000E0000
D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF09000600000
导致漏洞的是\object标签内容,其中的\objocx代表在OLE容器中嵌入OCX控件,后面的\objdata包含对象数据,OLE对象采用OLESaveToStream结构,后面的D0CF11E0是OLE签名,代表DOCFILE,从此处开始就是OLE数据。
对OLE对象进行提取和分析,发现覆盖返回地址的0x41414141位于EleName=Contents的Data字段。
覆盖返回地址的0x41414141存放在EleName=Content的data字段中
2 详细分析
1. 用windbg附加WINWORD.exe,打开poc.doc,程序断下,EIP指向41414141
EIP指向41414141
2. 查看栈回溯,栈回溯已经被破坏掉了
栈回溯
3. 查看栈中信息,离41414141最近的返回地址位于0x275c8a0a,位于MSCOMCTL.ocx模块
4. 从0x275c8a0a开始向前反汇编20条指令。看到0x275c8a0a位于函数sub_275c89c7中。
5. 重新加载poc.doc,在MSCOMCTL.ocx刚加载时下断点,单步运行到0x275c89cd时,对esp+4(下一栈帧的栈顶,即返回地址)下内存写断点,发现程序断在了sub_275c876d函数里面。
单步执行到0x275c89cd
在返回地址下断点
对返回地址进行写操作发生在函数sub_275c876d中
6. 在0x275c87cb处进行复制的时候发生了栈溢出,导致返回地址被覆盖。查看代码,确定栈溢出原因。
发生栈溢出
3 总结