CVE-2018-0798:Microsoft office 公式編輯器 Matrix record 字段棧溢出漏洞調試分析

\x01 前言

  • 2018 年 1 月 9 日,Office 公式編輯器再曝出新漏洞,編號爲 CVE-2018-0798。提起公式編輯器大家都不陌生,之前的 CVE-2017-11882 和 CVE-2018-0802 這對姊妹漏洞都出自這裏,當然了這個只是公開的漏洞,還有一些是沒有公開的。可能是由於公式編輯器漏洞有點多,所以這次 Windows 乾脆直接通過刪掉公式編輯器的方式來修復漏洞,一了百了。但漏洞補丁剛發佈一週,就已開始出現多例 CVE-2018-0798 漏洞的變種和在野利用,據說中國的一些組織也包括其中。漏洞原理比較簡單,是由於多次循環複製導致的棧溢出,幸運的是循環的次數和複製的數據都可以進行精確的控制,從而給漏洞利用帶來了便利。
    在這裏插入圖片描述

\x02 分析環境

  • 虛擬機:VMware 15 Pro + Windows7 SP1
  • 反彙編調試工具:x64dbg
  • 其他工具:C32Asm
  • 漏洞軟件:Office 2016
  • POC:CVE-2018-0798_poc.rtf(提取碼:d6rp)

\x03 調試分析

  • 在調試之前先將系統的 ASLR 給關閉,並且更改註冊表用來將調試器附加到公式編輯器上,爲的是方便調試。
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 由於在調試漏洞前並沒有找到該漏洞的 POC,所以需要手動的構造數據並且完成分析。幸運的是從閱讀國外的幾篇分析文檔中捕獲到了兩個重要的信息,第一個是漏洞觸發的函數爲 sub_443F6C,且存在複製操作的指令爲 mov [ecx],al。
    在這裏插入圖片描述
  • 第二個是出問題的數據結構來自公式編輯器的 Matrix,查詢一下發現有如下定義,從後面的分析中可以看出這個數據結構是專門用來處理公式編輯器中的矩陣公式的。
    在這裏插入圖片描述
  • 新建 RTF 文件,插入一個帶有矩陣公式的公式編輯器對象(OLE),之後在 sub_443F6C 函數的首地址下斷點,看看處理 Matrix 數據時是否走 sub_443F6C 函數這個流程。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 重新運行之後斷在了 sub_443F6C 函數上,通過分析堆棧調用,發現其父函數爲 sub_443E34,對這兩個函數下記錄斷點,看看該函數與解析矩陣數據是否有關聯。從下圖中可以看出當只有一個矩陣公式時 sub_443E34 執行了一次。
    在這裏插入圖片描述
  • 之後再添加一個矩陣。
    在這裏插入圖片描述
  • 通過對比可以發現,每處理一個矩陣都會調用到 sub_443E34 進行解析。
    在這裏插入圖片描述
  • 對其中一次調用 sub_443E34 函數調試看看:首先這個函數會調用 sub_43B349 函數對矩陣進行基本的判斷,判斷裏面的數據是否符合要求。
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 其次會調用一系列 sub_416352 函數去獲取對象中的數據,這裏特指 Matrix 數據。通過對取出的數據分析後發現 0x443E8F 地址調用的 sub_416352 函數會從樣本中取出 Matrix 偏移地址 +B 的數據用來控制循環讀取數據的次數。
    在這裏插入圖片描述
  • 這裏的對象其實就是公式編輯器對象,這屬於微軟 OLE 框架下的數據傳遞技術,我們知道公式編輯器是獨立於 Office 存在的,是一個完整的 .exe 或者 .dll 程序,也就是說 Office 如果想調用公式編輯器必須通過創建新進程的方式調用,而且進程之間的數據傳遞是基於 LRPC 的 OLE 接口技術,這裏是通過 GlobalLock 函數間接處理的。
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 接着進入 sub_443F6C 函數。
    在這裏插入圖片描述
  • 在該函數中首先會將之前取出的循環次數放入 eax 中,之後進行 (eax + 9) >> 3 的運算,運算完成之後再一次調用 sub_416352 函數去獲取需要複製到棧上的數據(Matrix 數據偏移 +D),之後通過 mov [ecx],al 指令將獲取到的數據複製到棧中,複製大小爲一個字節,完成之後判斷循環次數是否爲 0,爲 0 則跳出循環。
    在這裏插入圖片描述
  • 由此分析得出流程圖:
    在這裏插入圖片描述
  • 根據分析的結果對 Matrix 偏移 +B 的地方填充循環次數 FF,對偏移 +D 的地方填充複製的數據。
    在這裏插入圖片描述
  • 重新運行後首先會獲取到循環次數爲 0xFF。
    在這裏插入圖片描述
  • 進入 sub_443F6C 函數之後獲取到複製的數據爲 0xAA。
    在這裏插入圖片描述 - 到達此處後繼續循環。
    在這裏插入圖片描述
  • 至此棧上的返回地址已經被 Matrix 的數據給覆蓋了,實現了跳轉到任意地址的目的。
    在這裏插入圖片描述

關於 CVE-2018-0798 漏洞分析到此結束,如有錯誤,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章