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

  此次是不当心捡到一个poc.doc文档,致使Word出错来展开分析的。首先打开poc.doc时候,出现Access Violation错误(即EIP=0x41414141)。shell

此时能够从栈中回溯到上层调用函数的返回地址,可见0x275C8A0A处,难道咱们当前出错函数就是mscomctl.275C876D了吗?那咱们在0x275C8A05处打上断点探究一下...函数

当咱们再次打开poc.doc运行来看时发现,真正Crack的地方是在0x275C8A56处的ret 8,这说明以前某个部分复制数据到栈上致使栈溢出覆盖掉了本来的返回地址了。code

此次咱们单步运行发现复制的地方处于0x275C87CD处的rep指令,此时咱们将rep指令所处函数命名为VulnFunc,将以前ret 8所处函数命名为CrackFunc。那么咱们在IDA Pro中解析能够获得以下代码,文档

VulnFunc第一次调用,使得程序从文件中得到dwBytes(dwBytes=0x00008282)和v5(0x6A626F43),而dwBytes>=8,使得VulnFunc第二次调用,从文件从复制dwBytes字节数据到&dst(&dst=bp-8,也就是栈上的位置)处,以后再判断overwritten_bytes([bp-4])是否为0,如是即返回。咱们再来看看VulnFunc中的内容,it

VulnFunc大体是先从堆中申请dwBytes字节空间,而后将文件内容复制到此处空间内,最后再从堆中将数据复制到dst处(qmemcpy(...)),致使外层函数栈溢出了。io

    以上所需关键数据0x6A626F4三、0x0000828二、0x41414141均可以在poc.doc中找到,程序

由于CrackFunc返回前须要判断overwritten_bytes,因此0x1309-0x1320都必须是‘0’,有由于返回指令是ret 8,因此“41414141”后面16字节不能存在payload。因此最终的shellcode=‘0’*24+ROP(jmp esp)+‘0’*16+payload。im

-----------------------------------------------------------------------------------------------效果如上图命名

相关文章
相关标签/搜索