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.pswp.cn/news/40944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40944.shtml
英文地址,請注明出處:http://en.pswp.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集群可能出現的兩…