Microsoft office 公式编辑器 Matrix record 栈溢出漏洞分析

2019 年 8 月 25 日 FreeBuf

、前

2018 年 1 月 9 日,Office 公式编辑器再曝出新漏洞,编号为 CVE-2018-0798。提起公式编辑器大家都不陌生,之前的 CVE-2017-11882 和 CVE-2018-0802 这对姊妹漏洞都出自这里,当然了这个只是公开的漏洞,还有一些是没有公开的。可能是由于公式编辑器漏洞有点多,所以这次 Windows 干脆直接通过删掉公式编辑器的方式来修复漏洞,一了百了。但漏洞补丁刚发布一周,就已开始出现多例 CVE-2018-0798 漏洞的变种和在野利用,据说中国的一些组织也包括其中。漏洞原理比较简单,是由于多次循环复制导致的栈溢出,幸运的是循环的次数和复制的数据都可以进行精确的控制,从而给漏洞利用带来了便利。

二、分析环境

虚拟机:VMware 15 Pro + Windows7 SP1

反汇编调试工具:x64dbg

其他工具:C32Asm

漏洞软件:Office 2016

POC:CVE-2018-0798_poc.rtf(百度云:https://pan.baidu.com/s/1ojnaGLXFaAYcUK5bzPd56Q,提取码:d6rp)

三、调试分析

在调试之前先将系统的 ASLR 给关闭,并且更改注册表用来将调试器附加到公式编辑器上,为的是方便调试。

由于在调试漏洞前并没有找到该漏洞的 POC,所以需要手动的构造数据并且完成分析。幸运的是从阅读国外的几篇分析文档中捕获到了两个重要的信息,第一个是漏洞触发的函数为 sub_443F6C,且存在复制操作的指令为 mov [ecx],al。

第二个是出问题的数据结构来自公式编辑器的 Matrix,查询一下发现有如下定义,从后面的分析中可以看出这个数据结构是专门用来处理公式编辑器中的矩阵公式的。

新建 RTF 文件,插入一个带有矩阵公式的公式编辑器对象(OLE),之后在 sub_443F6C 函数的首地址下断点,看看处理 Matrix 数据时是否走 sub_443F6C 函数这个流程。

重新运行之后断在了 sub_443F6C 函数上,通过分析堆栈调用,发现其父函数为 sub_443E34,对这两个函数下记录断点,看看该函数与解析矩阵数据是否有关联。从下图中可以看出当只有一个矩阵公式时 sub_443E34 执行了一次。

之后再添加一个矩阵。

通过对比可以发现,每处理一个矩阵都会调用到 sub_443E34 进行解析。

对其中一次调用 sub_443E34 函数调试看看:首先这个函数会调用 sub_43B349 函数对矩阵进行基本的判断,判断里面的数据是否符合要求。

其次会调用一系列 sub_416352 函数去获取对象中的数据,这里特指 Matrix 数据。通过对取出的数据分析后发现 0x443E8F 地址调用的 sub_416352 函数会从样本中取出 Matrix 偏移地址 +B 的数据用来控制循环读取数据的次数。

这里的对象其实就是公式编辑器对象,这属于微软 OLE 框架下的数据传递技术,我们知道公式编辑器是独立于 Office 存在的,是一个完整的 .exe 或者 .dll 程序,也就是说 Office 如果想调用公式编辑器必须通过创建新进程的方式调用,而且进程之间的数据传递是基于 LRPC 的 OLE 接口技术,这里是通过 GlobalLock 函数间接处理的。

接着进入 sub_443F6C 函数。

在该函数中首先会将之前取出的循环次数放入 eax 中,之后进行 (eax + 9) >> 3 的运算,运算完成之后再一次调用 sub_416352 函数去获取需要复制到栈上的数据(Matrix 数据偏移 +D),之后通过 mov [ecx],al 指令将获取到的数据复制到栈中,复制大小为一个字节,完成之后判断循环次数是否为 0,为 0 则跳出循环。

由此分析得出流程图:

根据分析的结果对 Matrix 偏移 +B 的地方填充循环次数 FF,对偏移 +D 的地方填充复制的数据。

重新运行后首先会获取到循环次数为 0xFF。

进入 sub_443F6C 函数之后获取到复制的数据为 0xAA。

到达此处后继续循环。

至此栈上的返回地址已经被 Matrix 的数据给覆盖了,实现了跳转到任意地址的目的。

关于 CVE-2018-0798 漏洞分析到此结束,如有错误,欢迎指正。

*本文原创作者:护花使者cxy,本文属于FreeBuf原创奖励计划,未经许可禁止转载

精彩推荐


登录查看更多
0

相关内容

Microsoft Office 是一套由微软开发的办公软件。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
爬了自己的微信,原来好友都是这样的!
七月在线实验室
4+阅读 · 2018年1月18日
用 Scikit-Learn 和 Pandas 学习线性回归
Python开发者
9+阅读 · 2017年9月26日
Spark机器学习:矩阵及推荐算法
LibRec智能推荐
16+阅读 · 2017年8月3日
Semantics of Data Mining Services in Cloud Computing
Arxiv
4+阅读 · 2018年10月5日
Arxiv
6+阅读 · 2018年4月4日
Arxiv
5+阅读 · 2018年3月6日
Arxiv
5+阅读 · 2017年7月23日
VIP会员
相关资讯
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
爬了自己的微信,原来好友都是这样的!
七月在线实验室
4+阅读 · 2018年1月18日
用 Scikit-Learn 和 Pandas 学习线性回归
Python开发者
9+阅读 · 2017年9月26日
Spark机器学习:矩阵及推荐算法
LibRec智能推荐
16+阅读 · 2017年8月3日
Top
微信扫码咨询专知VIP会员