cve-2016-7193:wwlib 模块堆数据结构溢出

简介

  • 漏洞编号:cve-2016-7193
  • 漏洞类型:堆溢出
  • 软件名称:Office
  • 模块名称:wwlib
  • 历史漏洞:较多
  • 影响的版本
    在这里插入图片描述
  • 攻击利用:APT 攻击利器-Word 漏洞 CVE-2016-7193 原理揭秘

操作环境

  • 系统:Win10 1607
  • 软件版本:Office2016 16.0.4266.1003
  • poc:cve-2016-7193.rtf
  • 工具:Process Monitor、windbg、IDA

分析

  • 文件格式分析:样本经过博主进行简化,经过控制字运行分开运行之后发现 \dfrxst9(具有长度字节的 Unicode 字符数组)和 *\shpinst(RTF 用于绘图对象)控制字是触发漏洞的原因之一
    在这里插入图片描述

原因分析

崩溃点分析

  • 开启堆调试载入文档后引发异常,可见 eax 指向了未知地址导致了异常
    在这里插入图片描述
  • 从 IDA 分析崩溃点可以看出 mov ecx, [eax] 是取出了对象的虚表,并且调用了虚表 +1C 位置的函数
    在这里插入图片描述

逆向分析(基地址:0x66730000)

  • 经过逆向分析之后,得出 wwlib 在解析包含数字的 dfrxst 控制字时会在 wwlib!PTLS7::FsUpdateFinitePage+0x6d181(66a16efc) 地址上调用 sub_66a16c81 函数对数字进行处理。例如 langfe1024 控制字的数字为 1024,ASCII 为 0x31 0x30 0x32 0x34,在此基础上减去 0x30 得出 1 0 2 4,然后经过 ((((1) * a) * a + 2) * a + 4) 公式计算得出为 0x400,暂时称这个值为 “dfrxst 控制字后数字运算值”
    在这里插入图片描述
  • 在 wwlib!PTLS7::FsUpdateFinitePage+0x7a9c0(66A2473B) 地址上将 “dfrxst 控制字后数字运算值” 循环写入 v126 + v13 + 0x8FA0 这个地址,暂时将这个地址中的数据结构称为 “dfrxst 控制字后数字运算值数组”
    在这里插入图片描述
  • 在 wwlib!PTLS7::FsUpdateFinitePage+0x74113(66a1de8e) 地址中将 v257[0x8FC4] 传入 sub_669e393f 函数,v257 变量中的值实际上指向上面的 v126 + v13 计算后得出的地址
    在这里插入图片描述
  • 在 wwlib!PTLS7::FsUpdateFinitePage+0x39dc0(669E3B3B) 地址中会将之前 v257[0x8FC4] 往后的数据写入到 TLS(0x1e) 中指定的地址,方便后面取出
    在这里插入图片描述
  • 在 wwlib!PTLS7::FsDestroySubpageBreakRecord+0x10920(669477DD) 地址中会取出上面 TLS(0x1e) 的地址
    在这里插入图片描述
  • 在 wwlib!PTLS7::FsDestroySubpageBreakRecord+0xbfdd(66942E9A) 地址上会取出 “dfrxst 控制字后数字运算值数组” +0x24 偏移的数据,调试时值为 0x09c00c0c
    在这里插入图片描述
  • 然后调用 MSO_557 函数取出 0x09c00c0c + 0x48 地址的值,因为没有堆喷射,所以值为 0x00000000,最后在调用 mov ecx, [eax] 指令从 0x00000000 地址取值时崩溃
    在这里插入图片描述

根本原因

  • 由于 wwlib!PTLS7::FsUpdateFinitePage+0x7a9c0(66A2473B) 地址上循环调用 swtich case 138 分支将 “dfrxst 控制字后数字运算值” 写入 v126 + v13 + 0x8FA0 地址时并没有控制循环的次数,导致只要存在足够多的带数字的控制字,就会造成堆中的数据溢出
    在这里插入图片描述
  • 以下为写入前的 “dfrxst 控制字后数字运算值数组” 结构,可以看到 +0x24 的地方是一个数据结构,值为 0x56f30f90
56bc1450  00000009 00000000 00000000 00000000
56bc1460  00000000 00000000 00000000 00000000
56bc1470  00000001 56f30f90 00000000 00000000
56bc1480  00000000 00000000 00000000 00000000
56bc1490  00000000 00000000 00000000 00000000
56bc14a0  00000000 00000000 00000000 00000000
56bc14b0  00000000 00000000 00000000 00000000
56bc14c0  56f30f90 00000000 00000000 00000001
  • 在持续写入之后会造成溢出,可以看出 0x56f30f90 变成了 0x09c00c0c。至于为什么 +0x20 的地方没有变化,因为这是一个 int 变量,用于统计写入的字节大小,并且在写入之后进行更新
56bc1450  0c0cc009 0c09c00c 0c09c00c 0c09c00d
56bc1460  0bc0090c 15172018 09c00c0c 200c09c0
56bc1470  00000028 09c00c0c 00000000 00000000
56bc1480  00000000 00000000 00000000 00000000
56bc1490  00000000 00000000 00000000 00000000
56bc14a0  00000000 00000000 00000000 00000000
56bc14b0  00000000 00000000 00000000 00000000
56bc14c0  56f30f90 00000000 00000000 00000001

构建与利用

构建流程

  • 只要存在足够多的 dfrxst[数字] 控制字就会造成堆中数据溢出

利用姿势

  • 使用堆喷射技术将载荷喷射到 0x09c00c0c + 0x48 地址左右就可以进行利用,也可以手动修改 0x09c00c0c 地址

缓解

  • 补丁:https://learn.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-121

参考

  • https://paper.seebug.org/288/
  • https://bbs.kanxue.com/thread-221792.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 动态内存

C 动态内存 C 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存 很多时候,无法提前预知需要多少内存来存储某个定义变量中的特定信…

【Docker报错】docker拉取镜像时报错:no such host

报错信息 [rootSoft soft]# docker pull mysql Using default tag: latest Error response from daemon: Head "https://registry-1.docker.io/v2/library/mysql/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.80.2:53: no such host解决方法…

3D模型格式转换工具如何与Parasolid集成?

概述 HOOPS Exchange包括一个 Parasolid 连接器,它允许 Parasolid 开发人员轻松地将 CAD 数据导入到活动的 Parasolid 会话中。如果源数据基于 Parasolid(NX、Solid Edge 或 SolidWorks),则数据将按原样导入。 这意味着您可以假…

主数据管理案例-某政务

1、 背景介绍及难点分析 近年来,我国在大数据发展方面持续发力,取得了明显成效。但也要看到,目前我国大数据发展还存在“孤岛化”“碎片化”等问题,无序参与过度与创新参与不足并存,导致大数据资源配置统筹不&#xff…

【C++】list容器

1.list基本概念 2.list构造函数 #include <iostream> using namespace std;#include<list> //链表list容器构造函数//输出list链表 void printList(const list<int>& L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout &…

STM32入门学习之定时器PWM输出

1.脉冲宽度调制PWM(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM可以理解为高低电平的占空比&#xff0c;即输出高电平时间与低电平时间的比值。PWM的应用是否广泛&#xff0c;比如在步进电机的控制中&#xff0c;可以通过P…

【MySQL系列】-回表、覆盖索引真的懂吗

【MySQL系列】-回表、覆盖索引真的懂吗 文章目录 【MySQL系列】-回表、覆盖索引真的懂吗一、MYSQL索引结构1.1 索引的概念1.2 索引的特点1.3 索引的优点1.4 索引的缺点 二、B-Tree与BTree2.1 B-Tree2.2 BTree2.3 B-Tree 与BTree树的区别2.4 那么为什么InnoDB的主键最好要搞成有…

记一次 .NET 某外贸ERP 内存暴涨分析

一&#xff1a;背景 1. 讲故事 上周有位朋友找到我&#xff0c;说他的 API 被多次调用后出现了内存暴涨&#xff0c;让我帮忙看下是怎么回事&#xff1f;看样子是有些担心&#xff0c;但也不是特别担心&#xff0c;那既然找到我&#xff0c;就给他分析一下吧。 二&#xff1…

【软件测试】接口测试工具APIpost

说实话&#xff0c;了解APIpost是因为&#xff0c;我的所有接口相关的文章下&#xff0c;都有该APIpost水军的评论&#xff0c;无非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;虽然咱也还不是什么啥网红&#xff0c;但是不知会一声就乱在评论区打广告…

【力扣每日一题】2023.8.14 合并二叉树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们合并两棵二叉树&#xff0c;合并的方式就是把对应位置的节点的值相加&#xff0c;最后把合并后的二叉树的根节点返回出去。 这类二…

You have docker-compose v1 installed, but we require Docker Compose v2.

curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose --version

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解 以下六篇文章总结详细&#xff1a; 1. 一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD 2. 【深度学习】R-CNN 论文解读及个人理解 3、R-CNN论文详解 4、一文读懂Faster RCNN 5、学一百遍都…

JAVA基础知识(六)——异常处理

异常 一、异常概述与异常体系结构二、常见异常三、异常处理机制一&#xff1a;try-catch-finally四、异常处理机制二&#xff1a;throws五、手动抛出异常&#xff1a;throw六、用户自定义异常类七、开发中如何选择使用try-catch-finally还是使用throws八、如何看待代码中的编译…

goland插件推荐Rider UI Theme Pack

推荐一个goland配色插件Rider UI Theme Pack&#xff0c;里面自带visual assist配色&#xff0c;配色截图如下&#xff1a; 直接在plugins里面进行搜索或者在插件home page下载后进行安装&#xff0c; 然后按照下图进行设置即可。 此插件还适用于Jetbrains旗下的Clion和Pycharm…

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以

本地验证时重定向iperf包有出现calltrace错误&#xff0c;经推断&#xff0c;系统PAGE_SIZE<8k时可能出现&#xff08;getconf PAGE_SIZE指令可查看&#xff09;&#xff0c;按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次&#xff0c;需要将加载…

鸿蒙3.1 基于Token的访问控制

介绍 代码路径:security_access_token: ATM(AccessTokenManager)是OpenHarmony上基于AccessToken构建的统一的应用权限管理能力。 ATM(AccessTokenManager)是OpenHarmony上基于AccessToken构建的统一的应用权限管理能力。 应用的Accesstoken信息主要包括应用身份标识APPID、…

什么是游戏出海运营?

游戏出海运营&#xff0c;也称为游戏海外运营&#xff0c;是指将原本面向国内市场的游戏产品拓展到国际市场&#xff0c;以在海外地区推广、发行、运营游戏的过程。这涵盖了从市场调研、产品适应性优化、本地化翻译、推广营销、社区互动到客户支持等一系列策略和活动&#xff0…

阿里云对象存储服务OSS

1、引依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version> </dependency> <dependency><groupId>javax.xml.bind</groupId><artifa…

Mocha and Red and Blue

一、题目 题面翻译 给定长为 n n n 的仅由 R \texttt{R} R、 B \texttt{B} B、 ? \texttt{?} ? 组成的字符串 S S S&#xff0c;请你在 ? \texttt{?} ? 处填入 R \texttt{R} R 或 B \texttt{B} B&#xff0c;使得相邻位置字符相同的数量最少。 译者 ajthreac 题…

Hadoop HA集群两个NameNode都是standby或者主NameNode是standby,从NameNode是active的情况集锦

文章目录 背景架构HDFS HA配置错误原因解决方案方案一方案二方案三&#xff08;首先查看自己各参数文件是否配置出错&#xff09; 后记补充failovertransitionToActive 常用端口号及配置文件常用端口号hadoop3.xhadoop2.x 常用配置文件 这里说一下配置Hadoop HA集群可能出现的两…