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,一经查实,立即删除!

相关文章

【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的主键最好要搞成有…

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

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

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

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

一文看尽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;需要将加载…

Linux多线程【初识线程】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、什么是线程&#xff1f;1.1、基本概念1.2、线程理解1.3、进程与线程的关系…

分布式事务与解决方案

一、什么是分布式事务 首先我们知道本地事务是指事务方法中的操作只依赖本地数据库&#xff0c;可保证事务的ACID特性。而在分布式系统中&#xff0c;一个应用系统被拆分为多个可独立部署的微服务&#xff0c;在一个微服务的事务方法中&#xff0c;除了依赖本地数据库外&#…

【深入理解ES6】块级作用域绑定

1. var声明及变量提升机制 提升&#xff08;Hoisting&#xff09;机制&#xff1a;通过关键字var声明的变量&#xff0c;都会被当成在当前作用域顶部生命的变量。 function getValue(condition){if(condition){var value "blue";console.log(value);}else{// 此处…

代码随想录算法训练营第三十六天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间

代码随想录算法训练营第三十六天 | 435. 无重叠区间&#xff0c;763.划分字母区间&#xff0c;56. 合并区间 435. 无重叠区间:eyes:题目总结:eyes: 763.划分字母区间:eyes:题目总结:eyes: 56. 合并区间:eyes:题目总结:eyes: 435. 无重叠区间 题目链接 视频讲解 给定一个区间的…

并发编程系列-Semaphore

Semaphore&#xff0c;如今通常被翻译为"信号量"&#xff0c;过去也曾被翻译为"信号灯"&#xff0c;因为类似于现实生活中的红绿灯&#xff0c;车辆是否能通行取决于是否是绿灯。同样&#xff0c;在编程世界中&#xff0c;线程是否能执行取决于信号量是否允…

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据&#xff0c;减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

p-级数的上界(Upper bound of p-series)

积分判别法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 两个重要级数&#xff08;p级数和几何级数&#xff09; ht…

WPF显示初始界面--SplashScreen

WPF显示初始界面–SplashScreen 前言 WPF应用程序的运行速度快&#xff0c;但并不能在瞬间启动。当第一次启动应用程序时&#xff0c;会有一些延迟&#xff0c;因为公共语言运行时&#xff08;CLR&#xff09;首先需要初始化.NET环境&#xff0c;然后启动应用程序。 对于WPF中…