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

news2024/11/24 19:33:53

简介

  • 漏洞编号: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.coloradmin.cn/o/891842.html

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

相关文章

编译器过程

编译器过程 如果这个框架对应LLVM,为什么这么说LLVM是个框架呢?是因为它提供了中间表示的定义,即前端输出的文本格式定义. 那么 "前端" 可以是两者其一 : Clang 或者 LLVM-GCC "通用优化" 和 "x86后端" 是 LLVM 提供的. // LLVM 也提供 riscv后…

网络机顶盒什么牌子好?自费5000+测评整理网络机顶盒排行榜

在挑选网络机顶盒的时候很多人贪便宜选山寨杂牌,买回家问题频发,我做数码测评几年来身边的朋友们总会问我网络机顶盒什么牌子好,我自费购入了将近二十款网络机顶盒,通过软硬件的全方位对比后整理了网络机顶盒排行榜TOP5&#xff1…

CentOS7配置yum清华源、阿里源

CentOS7配置yum清华源、阿里源 本文为自己安装记录回顾用 下面的是Centos7 更换yum清华源、阿里源 Centos7默认的服务器是在国外,连接很慢。 更换成国内的镜像源,使用yum清华源、阿里源,连接就会快一点 下面介绍更换方法 前提:打…

SSD202D-logo分区添加dtb

SSD202D-kernel-uimage后面加入dtb_旋风旋风的博客-CSDN博客 1.由于内核的uimage老是压缩解压缩,拿到压缩包里面dtb实在困难; 2.把dtb烧在后面又有安全隐患;而且还会有打包升级方法ota之类的很多;又毙掉了, 3.最后直接把dtb放在logo的包里,但是logo包要想添加好,也要深刻的理…

【小梦C嘎嘎——启航篇】string常用接口的模拟实现

【小梦C嘎嘎——启航篇】string常用接口的模拟实现😎 前言🙌string 模拟实现1、iterator 迭代器相关使用函数实现2、构造函数接口实现3、 传统写法——拷贝构造函数接口实现4、 现代写法——拷贝构造函数接口实现5、析构函数接口实现6、传统写法—— 赋…

开源网盘空间本地挂载神器,挂载百度、阿里云盘、OneDrive等云盘到本地工具-AList

开源网盘空间本地挂载神器,挂载百度、阿里云盘、OneDrive等云盘到本地工具-AList 什么是Alist 一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动。 AList 是一款免费开源支持多存储的自建网盘程序 (文件列表…

吃肉原创——使用PYQT设计的yolov8目标检测GUI界面

需要快速编写一个GUI图形界面 pip install pyqt5 pip install pyqt5-tools然后去conda环境中查找启动程序 F:\APP\miniconda\envs\yolov8gui\Lib\site-packages\qt5_applications\Qt\bin\designer.exe双击可以启动,我们可以把它发送到桌面快捷方式 准备设计图&am…

最通俗易懂的 - Tomcat 核心源码仿写 第二版代码

– 更新信息 – 第一版代码实现了基本的交互功能,但只实现了单线程,此次迭代修改多线程,并升级为Maven项目,同时优化代码排版,提高代码可读性 第一版代码介绍博客地址:最通俗易懂的 - Tomcat 核心源码仿写…

odoo-035 Pycharm git commit 提交提示 No changes detected

文章目录 问题查找解决其他? 问题 在 gitee 上面新建的 git 项目,dowanload 下来,在 Pycharm 中修改后发现改完就变成白色到了,不是绿色或蓝色的,然后 git commit 的时候提示 No changes detected。 查找 上面是在 …

spring bean创建总览 1

1 开始 这是一个总图 下边慢慢看 我们最基础的写的方式就是xml的方式去写 像这样, 而我们会通过applicationContext的方式去获得我们的bean ,我其中一篇博客就写到了applicationContext他的父类就是beanFactory 但是中间的是怎么样处理的呢&#xff1f…

springboot、java实现调用企业微信接口向指定用户发送消息

因为项目的业务逻辑需要向指定用户发送企业微信消息&#xff0c;所以在这里记录一下 目录 引入相关依赖创建配置工具类创建发送消息类测试类最终效果 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

从 Ansible Galaxy 使用角色

从 Ansible Galaxy 使用角色 根据下列要求&#xff0c;创建一个名为 /home/curtis/ansible/roles.yml 的 playbook &#xff1a; playbook 中包含一个 play&#xff0c; 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。 此角色配置一项服务&#xff0c;以…

代码随想录算法训练营第63天|单调栈part02|503.下一个更大元素II、 42. 接雨水

代码随想录算法训练营第63天&#xff5c;单调栈part02&#xff5c;503.下一个更大元素II、 42. 接雨水 503.下一个更大元素II 503.下一个更大元素II 思路&#xff1a; 如何处理循环数组 相信不少同学看到这道题&#xff0c;就想那我直接把两个数组拼接在一起&#xff0c;然…

银河麒麟服务器v10 sp1 .Net6.0 上传文件错误

上一篇&#xff1a;银河麒麟服务器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 .NET 6之前&#xff0c;在Linux服务器上安装 libgdiplus 即可解决&#xff0c;libgdiplus是System.Drawing.Common原生端跨平台实现的主要提供者&#xff0c;是开源mono项目。地址…

小红书美妆护肤种草推广:深度剖析与实战策略

在这个平台上&#xff0c;用户可以分享自己的购物心得和产品评价&#xff0c;为其他消费者提供购买参考。这种基于用户真实体验的分享&#xff0c;更容易赢得消费者的信任&#xff0c;从而提高产品的购买转化率。 小红书俨然成为了美妆护肤品牌种草推广的主要战场&#xff0c;…

如何实现客户自助服务?打造产品知识库

良好的客户服务始于自助服务。根据哈佛商业评论&#xff0c;81% 的客户在联系工作人员之前尝试自己解决问题。92% 的客户表示他们更喜欢使用产品知识库/帮助中心。 所以本文主要探讨了产品知识库是什么&#xff0c;有哪些优势以及如何创建。 产品知识库是什么 产品知识库是将…

“展会建筑小背心”被百万网友吐槽火遍网络!到底为什么?

奇葩的建筑在国内绝对是一个又一个经典的存在&#xff01;前有央视大楼被网友吐槽像大裤衩&#xff0c;后就有金主爸爸富而喜悦耗资50多万设计的展会建筑&#xff0c;被数万网友温柔吐槽像极了“展会建筑小背心”&#xff01;更是在不到短短的24小时里&#xff0c;就被微博网友…

Scratch 之 如何制作鼠标框(2)—— 鼠标框框定角色

hello&#xff0c;大家好&#xff0c;欢迎来到鼠标框系列的第二课时&#xff01; 咱们废话不多说&#xff0c;直接开始 首先&#xff0c;温故知新一下&#xff0c;上个教程我们讨论了如何绘制鼠标框&#xff0c;网址&#xff1a;绘制鼠标框 你说&#xff0c;一个鼠标框&…

excel条件格式:不同组对应位置对比标记

问题描述 下图中有两组数据&#xff0c;想要对比两个对应位置的数据并标记 条件格式 选中其中一个单元格&#xff0c;条件格式->新建规则 使用公式确定要设置格式的单元格&#xff0c;自定义需求 格式化剩余同样标准的单元格

自定义WEB框架结合Jenkins实现全自动测试

自定义WEB框架结合Jenkins实现全自动测试 allure生成 allure生成 1.allure–纯命令运行 -固定的–稍微记住对应的单词即可。2 安装&#xff0c;2个步骤: 1.下载allure包&#xff0c;然后配置环境变量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在…