CVE-2012-0158个人分析

发布者:Ox9A82
发布于:2016-03-22 15:31

CVE-2012-0158是一个比较有名的老漏洞了,这次从论坛上找到一个poc文件,利用这个poc来分析CVE-2012-0158漏洞的形成。

http://bbs.pediy.com/showthread.php?t=207638

参考自此帖子,但是分析是个人独立完成的,只是参考了poc并没有抄袭思路。

本文步骤:重现漏洞-->漏洞分析-->漏洞利用-->总结

1.重现漏洞

打开poc文件,结果如图

环境如下

如图可见漏洞复现成功,弹出一个计算器。

2.漏洞分析

通过已有的POC找出漏洞产生的原因。

首先定位shellcode在内存中的地址,这里使用的是通过对api下断点找到shellcode的地址。

如图。可见此时shellcode已在栈中。00121461即为栈中空间,从3个nop起为shellcode

在此时看一下栈的整体结构,如下图

4个byte的nop之后接的便是shellcode,根据栈溢出的特点我猜测,7FFA4512为覆盖栈返回地址的地方。跟一下发现如图

原来7FFA4512处是一个jmp esp

这是一个常见的栈溢出跳板。据此我判断这是一个使用跳板地址覆盖栈返回地址的栈溢出,而且此时的esp正好指向shellcode的起始位置,4个byte的nop用来

抵消retn 0x8造成的esp下移。据此栈示意图如下

接下来查找是哪里发生的覆盖,因为是当前函数的栈祯发生溢出,说明肯定是子函数或者当前函数导致的覆盖。但是本栈祯已经被覆盖的一塌糊涂了,怎么知道这个函数的地址呢?

那么就只能对栈进行回溯,正好可以发现一个已经用过的函数返回地址,找到发生溢出的这个栈祯。经过单步跟进最终发现产生问题的语句在这里,如图

可见是一个rep movs导致的溢出。

 

如图可知溢出函数处于mscomctl模块


声明:该文观点仅代表作者本人,转载请注明来自看雪