CVE-2012-0158 office缓冲区溢出漏洞报告
2021-07-02 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:127 收藏

本文为看雪论坛优秀文章

看雪论坛作者ID:钢针
软件名称:MicrosoftOffice
软件版本:2003
漏洞模块:MSCOMCTL.OCX
模块版本:2003
编译日期:2020-11-19
操作系统:Windows7-x86
漏洞编号:CVE-2012-0158
危害等级:高危
漏洞类型:缓冲区溢出
威胁类型:本地
分析日期:2021年6月10日

1

软件简介

Microsoft Office2003是全球使用最广泛的办公软件,Microsoft Office 2003 SP3 五合一此版本包含 Word、Excel、Powerpoint、Outlook、Access 五个组件的全部功能!

2

漏洞成因

文件字节的长度,和文件字节的限制的验证长度,都保存在文件中,导致可以很容易的修改这2个值,而导致栈中存储复制内容的目标数组溢出。

3

利用过程 

1、设置OD。
2、首先运行word.exe,然后用OD附加。

3、OD按F9运行,用word程序,打开poc文档。
4、样本的获取:
4.1  在kail中使用msfconsole命令,查找是否有改漏洞利用的程序:

4.2  查看漏洞信息:

4.3  根据信息准备环境。

office2010上会使用ROP进行绕过DEP和ASLR,需要通过文件——打开的方式运行恶意样本。

加入一个弹计算器的payloads,填写样本必要参数生成样本。

5、将样本提取到虚拟机进行分析,点开完美触发。
6、查看样本,寻找特征jmp esp等。

7、猜测样本所使用的API:

7.1  POC弹出了计算器,那么很可能调用的API是以下几个:

CreateProcess(参数多不是首选),
WinExec,导出模块是kernel32.dll,比较常用。

system 导出模块是ucrtbase.dll,word不一定会加载。

7.2  验证猜想:
(1)先在WinExec设置断点,看看有没有调用:

微软符号服务器:http://msdl.microsoft.com/download/symbols,

断到WinExec:

查看堆栈,发现栈破坏严重,无法得到有效信息。

正常的函数调用call 的地址距离 0FFA000(堆栈)很远。

栈回溯看看调用处是否像是ShellCode:

u 001217c6 l-20 含义:反汇编 地址001217c6 l(是list的意思) -20 是向上20条指令。

有较多pop 还有popad 看着像是ShellCode(往上找,找到一些NOP)。

查看nop之前的4个字节是什么指令:

是JMP ESP,那么应该就是溢出点的位置,后应该就是ShellCode了。

查看样本中是否有这些OpCode:
十六进制字节搜索未找到。
其他方式搜索到了:

分析:因为此时调用堆栈窗口无有效信息,栈被破坏,而且存在jmp esp指令,那么这个是一个栈溢出漏洞。

将jmp esp 后的shellCode删掉,最小样本法。

无ShellCode的样本已经崩溃,异常偏移不一定就是出错的位置,调试看看:

查看栈中数据:

看到栈中有一些之前调用的信息,

重新调试在MSCOMCTL!DllCanUnloadNow+0xc7d位置设置断点,查看:

命令:sxe ld:MSCOMCTL.OCX// 断下后设置断点bp MSCOMCTL!DllCanUnloadNow+0xc7d

发现异常,而且esp全为0,看来在这个位置之前就已经被溢出了,需要继续向上查找 。

bp MSCOMCTL!DllGetClassObject+0x41cc6
暂时没看出问题,继续单步,
没走几步就到了RET:

继续挖信息:
bp MSCOMCTL!DllGetClassObject+0x41abc

这个位置还没有溢出,可以继续跟:
这个call F8跟进去,
再按F8几次,
调用栈信息由很多突然变了,减少了好几条,转到OD中查看。

等到打开漏洞,doc文件时,设置事件,中断于新模块。

前面我们已经知道了模块和有问题的指令。

下断点:
f7进入该函数,走到即将出错的那条函数查看堆栈信息。

结束OD,重新附加程序,运行到此位置。对比:

将已知出问题的MSCOMCTL.OCX 模块,拖入到ida中分析定位,比较基址是否一致。

定位到问题函数:

同理溢出发现是在拷贝中溢出的,所以必然是destin参数溢出了,也就是lpMema参数,而该参数是sub_275c876D传入的,所以需要回溯这个参数。前边已经知道这个函数位置就是0x275c8A05了,直接定位。
显示dwBytes 是8282,返回ida中查找该函数位置:

小结:目前来看引起溢出的原因就是dwBytes,因为它决定了到底要复制大的数据,尝试在漏洞.doc寻找该数值。

4

漏洞成因

文件字节的长度,和文件字节的限制的验证长度,都保存在文件中,导致可以很容易的修改这2个值,而导致栈中存储复制内容的目标数组溢出。

5

PoC

5.1 为什么jmp esp 要加nop(9090..) 1?

6

结语

office有一些漏洞,都是此类溢出。此类的关键点,就在于将限制文档字节个数的值放在了文档中,导致不怀好意的人可以任意修改。而且加上,office未对读取到的漏洞.doc中限制字节的值做校验,导致溢出。
尽量不要点击来历不明的文档,比如.doc.pdf等,因为可能有病毒。
- End -

看雪ID:钢针

https://bbs.pediy.com/user-home-924661.htm

  *本文由看雪论坛 钢针 原创,转载请注明来自看雪社区

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458387397&idx=1&sn=f53c21ea133b69fcde8f8a2df8c39646&chksm=b18f334f86f8ba59e823d817667b38edf749debd3886a5b42e5ef7d57d0b2922fedc4794128d#rd
如有侵权请联系:admin#unsafe.sh