微软公式编辑器系列漏洞分析(一):CVE-2017-11882

0x00 简介

CVE-2017-11882为Office内存破坏漏洞。攻击者可以利用漏洞以当前登录的用户的身份执行任意命令。所影响的组件是Office 公式编辑器。需要注意的是这里是老版本的公式编辑器,微软在新版本的office中已经默认不使用了。不过,微软仍然保留老版本的公式编辑器,为了兼容。在编辑使用老版本的公式编辑器制作的公式时,才会使用老版本的公式编辑器。

0x01 漏洞分析

打开exploit.rtf后直接弹出计算器,看到计算器是EQNEDT32.EXE的子进程。判断漏洞出现在EQNEDT32.EXE

我们使用windbgkernel32!WinExec下断点,断下来后看调用栈。

可以看到,此时kernel32!WinExec的参数为cmd.exe /c calc.exe就是PoC触发后的WinExec调用。接着,我们回溯调用栈。看看kernel32!WinExec是哪个函数调用的。

继续向上回溯,看上一个函数

继续看0x004115a7

伪代码很简单,下个断点跟一下。在执行完sub_41160F后计算器已经弹出,说明漏洞出现在sub_41160F中。随后,我们在sub_41160F下断点。

函数结束时即到达ret指令时

发现返回地址已经被修改,变成了00430c12,我们继续回看Exploit

这就是明显的栈溢出。

0x02 Exploit 分析

使用rtfobj.pyOLE Data导出来。

这里,Equation Native的结构为Equation Native = Equation Stream Header + MTEF Header + MTEF Data

其中Equation Stream Header的结构为

MTEF Header的结构为

Description

Size (byte)

Value

Comment

MTEF Version

1

0x3

MTEFv3

Generating Platform

1

0x3

Windows

Generating Product

1

0x1

Equation Editor

Product Version

1

0x3

Product Subversion

1

0xa

MTEF Data的结构为

Description

Size (byte)

Value

Comment

Tag

1

0x8

0x8 denotes Font record

Typeface Number

1

0x5a

Style

1

0x5a

Font Name

Variable, NULL terminated

“cmd.exe /c calc.exe AAAAAAAAAAAAAAAAAAAAAAAA” + 0x00430c12

到这里,问题就很明显了。原因就是在于在处理字体名称的时候,没有做长度判断。导致使用strcpy拷贝字体名称导致栈溢出。

int __cdecl sub_41160F(char *a1, char *a2, int a3)
{
  int result; // eax@12
  char v4; // [sp+Ch] [bp-88h]@5
  char v5; // [sp+30h] [bp-64h]@4
  __int16 v6; // [sp+51h] [bp-43h]@5
  char *v7; // [sp+58h] [bp-3Ch]@7
  int v8; // [sp+5Ch] [bp-38h]@1
  __int16 v9; // [sp+60h] [bp-34h]@1
  int v10; // [sp+64h] [bp-30h]@1
  __int16 v11; // [sp+68h] [bp-2Ch]@1
  char v12; // [sp+6Ch] [bp-28h]@1
  int v13; // [sp+90h] [bp-4h]@1

  LOWORD(v13) = -1;
  LOWORD(v8) = -1;
  v9 = strlen(a1);
  strcpy(&v12, a1); // overflow here
  _strupr(&v12); 
  ...
}

这里,a1是字体名称字符串,可见在strcpy进行字符串拷贝时没有进行长度判断,导致栈溢出。

0x03 Patch Diff

此时ecx = strlen(a1) + 1,所以微软在这里对字体长度做了限制,不大于0x21,所以这里不会有问题了。

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

linux系统编程之进程(三):exec系列函数和system函数

一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创...

28960
来自专栏JackieZheng

Spring实战——缓存

缓存 提到缓存,你能想到什么?一级缓存,二级缓存,web缓存,redis…… 你所能想到的各种包罗万象存在的打着缓存旗号存在的各种技术或者实现,无非都是宣扬缓...

200100
来自专栏蓝天

从程序员角度看ELF

原文:http://xcd.blog.techweb.com.cn/archives/222.html

10840
来自专栏知识分享

关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑

---恢复内容开始--- 这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时...

37180
来自专栏一枝花算不算浪漫

页面静态化技术Freemarker技术的介绍及使用实例.

42860
来自专栏小樱的经验随笔

汇编语言第三版答案(王爽)

汇编语言答案(王爽)  此文只是用来存个档,不喜勿喷 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器...

598110
来自专栏开发 & 算法杂谈

Zookeeper C API学习总结

客户端使用C语言开发,zookeeper提供了两个库,zookeeper_st(单线程库)以及zookeeper_mt(多线程库)。

1.1K50
来自专栏Danny的专栏

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

16020
来自专栏老码农专栏

原 荐 ActFramework 发布 1.

23230
来自专栏LeoXu的博客

Tapestry 教程(六)使用BeanEditForm来创建用户表单

在前面一章,我们看到了Tapestry如何处理简单地链接,甚至于处理能在URL中传递信息的链接。在本章,我们将会看到Tapestry如何以不同的方式做同样的事情...

11220

扫码关注云+社区

领取腾讯云代金券