[原创]不死鸟之眼——CVE-2012-0158的常见利用姿势
不死鸟之眼——CVE-2012-0158的常见利用姿势
0x00 概述
称CVE-2012-0158为不死鸟是因为直到CVE-2017-0199公布前,长达整整5年的时间,0158似乎一直以一种傲视群雄的姿态霸占着各大安全公司的通用漏洞利用榜单(文档类)。
CVE-2012-0158属于非常经典的基于栈的缓冲区溢出漏洞,在《漏洞战争》中栈溢出漏洞分析章节有对该漏洞进行详细分析,使得该漏洞成为不少二进制漏洞分析者入门的不二选择。
本文详细叙述漏洞触发原因、常见文档格式中的利用以及静态检测规则,算作分析0158的一段总结。如有不尽和错误之处希望大家批评指正。
0x01 漏洞成因
CVE-2012-0158的漏洞成因在很多文章中都说得非常详尽。我最早是看维一零的文章《手把手教你如何构造office漏洞EXP(第一期》,里面对漏洞的原理到漏洞利用进行深入浅出的讲解。这里再简单介绍一下造成该漏洞的原因:CVE-2012-0158漏洞发生在MSCOMCTL.OCX模块,在一段内存拷贝时,由于检查条件错误造成基于栈的缓冲区溢出。
我们找一个POC调试一下。当我们来到漏洞溢出点的时候,结合当前环境寄存器的值和内存布局分析该溢出。

很明显,源地址为0x0020DEF8(即esi),目的地址为0x00137678(即edi),拷贝长度为0x800(即ecx * 4)字节。
查看当前内存布局:

查看调用栈:

当拷贝进行到第四次时,将保存在栈空间的返回地址0x275E742B覆盖为0xAAAAAAAA。

直接运行,在执行到EIP为0xAAAAAAAA时,触发访问异常。

结合以上分析,判定在漏洞触发点拷贝的数据长度最大应该为8字节,如果多于8字节将造成缓冲区溢出。可以使用IDA Pro查看函数反汇编代码,本文不再累述。
0x02 文件布局
结合以上分析时内存的数据,我们可以很快地在文件十六进制中找到对应的字节序列。

结合《漏洞战争》中对该内存中结构体的描述,我们可以将该样本中的结构体定义如下:
struct COLLSTREAMHDR
{
DWORD dwMagic = 0x6A626F43;
DWORD dwVersion = 0x00000064;
DWORD cbSize = 0x00000800;
}
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
