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,所以這里不會有問題了。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/516/
暫無評論