CVE-2012-0158分析

这个实验参考了漏洞战争和http://blog.csdn.net/qq_35519254/article/details/53103931。

本来想按照漏洞战争上的步骤来实现的,但是不知道为啥在275c89c7那里老断不下来,我已经把MSCOMCTL.ocx下了断点之后才打开poc.doc的,唉,也不知道为啥。
实验写的有点乱,但是按照我想的思路从头做到了尾,总算是把这个入门级的漏洞给分析完了。下一次分析cve-2010-2883。

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 总结
发生栈溢出的原因就是只分配了0x14字节的空间,第一次用掉了0xC,只剩下了0x8,但是第二次复制的数据远远大于0x8,复制的时候也没有做长度检验,导致多出的数据溢出到了返回地址,把函数的返回地址给覆盖了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值