CVE-2012-0158漏洞分析

本文详细分析了CVE-2012-0158漏洞,介绍了在MSCOMCTL.ocx模块中由于读取长度不当导致的栈溢出问题。通过逆向工程,确定了漏洞成因,并展示了如何利用该漏洞,包括shellcode的编写与测试。

1. 环境简介与poc获取

操作系统:Window 7 专业版 (32 位)

软件:office 2003 sp3

工具:Ollydbg,windbg,IDA Pro,010editor,Immunity Debugger

Poc获取

网络,论坛, Metasploit

https://www.exploit-db.com/

https://www.securityfocus.com/

2. 漏洞复现

打开od,设置od异常选项以及strongod插件设置,将异常设置去除勾选。

图2-1 异常设置

打开word,将word附加进od,在poc样本用word打开,发现eip指向了41414141,观察堆栈窗口,返回地址都被淹没,这可能是一个栈溢出漏洞。

图2-2 漏洞复现

3. 漏洞成因

观察堆栈,找到前一层的调用,发现是执行了275C876D这个函数才覆盖了esp

图3-1 找到关键函数

在系统中找到这个模块,用IDA进行分析。

图3-2 275C876D函数

分析可知,v7和dwBytes都是从文件中读取出来的,当两个数据相等时,且他们的长度很大时,就会造成栈溢出。

观察275C876D函数传入的参数,如何3-3可知8282为传入的长度。

图3-3 传入参数的长度

将poc文件用010editor打开, 查找8282

图3-4 查找8282

如图,8282有两处,猜测一个是dwBytes,一个是v7,分别修改为8283和8284

图3-5 修改数据

重复之前的步骤,再次到达传入的第一个参数,发现已经变成了8283,进入函数内部,到达dwBytes和v7的判断,v7变成了8284,说明v7和dwBytes都是从文件中读取出来的。

图3-6 dwBytes大小

图3-7 函数内部判断

经过调试和分析之后,可以总结一下

CVE-2012-0158 漏洞触发在 MSCOMCTL.ocx 模块中,漏洞成因是在读取数据时,读取的长度和验证的长度都在文件中,所以可以自行构造,进而触发栈溢出。

4. 利用过程

在poc的基础上,编写shellcode,达到利用漏洞。

图4-1 poc shellcode结构

4.1 寻找跳板指令

打开Immunity Debugger,附加word。利用mona脚本命令!mona moudles,查看模块

图4-2 查看模块

找到msvbvm60.dll模块,使用!mona find -s “\xff\xe4” -m msvbvm60.dll

图4-3 jmp esp

如图4-3,找到一个合适的jmp esp, 0x729A0535

图4-4 写入跳板指令

再次重复步骤,走到尾部,eip指向了我们找的跳转地址。

图4-5 eip指向

4.2 编写shellcode

根据以下的步骤,编写shellcode

1. 获取 Kernel32 基地址

2. 获取 GetProcAddress 地址

3. 获取 LoadLibraryExA 地址

4. 获取 user32 基地址

5. 获取 MessageBoxA 地址

6. 调用 MessageBoxA 地址

7. 获取 ExitProcess 地址

8. 调用 ExitProcess

首先将用到的函数名都以ASICC码形式整理出来

图4-6 ASICC码形式的数据

编写汇编代码,用于弹出一个hello world的MessageBox的弹框

图4-7 部分汇编代码

编写成功后,测试能够弹出hello world

 

图4-8 弹框

用od将这段shellcode提取出来复制到poc文件shellcode起点处,保存文件,打开文件,弹出hello world,漏洞利用成功。

至此,CVE-2012-0158漏洞分析完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值