作者:WeaponX@逢魔安全實驗室

0x00 簡介

CVE-2017-11882為Office內存破壞漏洞。攻擊者可以利用漏洞以當前登錄的用戶的身份執行任意命令。所影響的組件是Office 公式編輯器。需要注意的是這里是老版本的公式編輯器,微軟在新版本的office中已經默認不使用了。不過,微軟仍然保留老版本的公式編輯器,為了兼容。在編輯使用老版本的公式編輯器制作的公式時,才會使用老版本的公式編輯器。

0x01 漏洞分析

打開exploit.rtf后直接彈出計算器,看到計算器是EQNEDT32.EXE的子進程。判斷漏洞出現在EQNEDT32.EXE

我們使用windbg在kernel32!WinExec下斷點,斷下來后看調用棧。

可以看到,此時kernel32!WinExec的參數為cmd.exe /c calc.exe就是PoC觸發后的WinExec調用。接著,我們回溯調用棧。看看kernel32!WinExec是哪個函數調用的。

繼續向上回溯,看上一個函數

繼續看0x004115a7

偽代碼很簡單,下個斷點跟一下。在執行完sub_41160F后計算器已經彈出,說明漏洞出現在sub_41160F中。隨后,我們在sub_41160F下斷點。

函數結束時即到達ret指令時

發現返回地址已經被修改,變成了00430c12,我們繼續回看Exploit。

這就是明顯的棧溢出。

0x02 Exploit 分析

使用rtfobj.py將OLE Data導出來。

這里,Equation Native的結構為Equation Native = Equation Stream Header + MTEF Header + MTEF Data 。

其中Equation Stream Header的結構為

MTEF Header的結構為

MTEF Data的結構為

到這里,問題就很明顯了。原因就是在于在處理字體名稱的時候,沒有做長度判斷。導致使用strcpy拷貝字體名稱導致棧溢出。

int __cdecl sub_41160F(char *a1, char *a2, int a3)
{
  int result; // eax@12
  char v4; // [sp+Ch] [bp-88h]@5
  char v5; // [sp+30h] [bp-64h]@4
  __int16 v6; // [sp+51h] [bp-43h]@5
  char *v7; // [sp+58h] [bp-3Ch]@7
  int v8; // [sp+5Ch] [bp-38h]@1
  __int16 v9; // [sp+60h] [bp-34h]@1
  int v10; // [sp+64h] [bp-30h]@1
  __int16 v11; // [sp+68h] [bp-2Ch]@1
  char v12; // [sp+6Ch] [bp-28h]@1
  int v13; // [sp+90h] [bp-4h]@1

  LOWORD(v13) = -1;
  LOWORD(v8) = -1;
  v9 = strlen(a1);
  strcpy(&v12, a1); // overflow here
  _strupr(&v12); 
  ...
}

這里,a1是字體名稱字符串,可見在strcpy進行字符串拷貝時沒有進行長度判斷,導致棧溢出。

0x03 Patch Diff

此時ecx = strlen(a1) + 1,所以微軟在這里對字體長度做了限制,不大于0x21,所以這里不會有問題了。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/516/