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模块