漏洞简介
CVE-2017-11882,漏洞出现在模块EQNEDT32.EXE中,该模块为公式编辑器,在office安装过程中被默认安装,该模块以OLE技术将公式嵌入在office文档中。该漏洞的成因是EQNEDT32.EXE进程在读入MathType数据时,在拷贝字体名的时候没有对名称长度进行校验,从而造成了栈溢出。
分析环境
1:Win7 + office 2010
数据结构分析
OLE OBJECT DATA = EQNOLEFILEHDR + MTEFData
MTEFData = MTEF header + MTEF Byte Stream
EQNOLEFILEHDR 结构如下
struct EQNOLEFILEHDR {
WORD cbHdr; // 格式头长度,固定为0x1C。
DWORD version; // 固定为0x00020000。
WORD cf; // 该公式对象的剪贴板格式。
DWORD cbObject; // MTEF数据的长度,不包括头部。
DWORD reserved1; // 未公开
DWORD reserved2; // 未公开
DWORD reserved3; // 未公开
DWORD reserved4; // 未公开
};
MTEF header结构如下
MTEF Byte Stream
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101625256-692003560.png)
数据 8 对应的数据类型为FONT ,数据流对应如下
在POC中,对应以上结构的的数据如图所示
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101645599-1105134909.png)
漏洞分析
如下图所示,dstStr 为局部变量,大小为36字节,在进行拷贝的时候,并没有进行大小的验证。所以造成 了栈溢出。
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101720693-2046568601.png)
调试验证:
通过对下面的两张图进行对比,可以明白栈溢出的触发过程。
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101802662-1549008332.jpg)
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101900365-233260786.jpg)
被修改后的函数调用如下图所示,在前文中已经提到,该公式编辑器并没有开启ASLR。这个硬编码的地址0x00430C12对应于对函数WinExec的调用。因而该字体名对应的命令得以执行。
![](https://images2017.cnblogs.com/blog/779459/201801/779459-20180117101934256-44236186.jpg)