轉自: http://hi.baidu.com/antivirusboy/blog/item/d2c1970017687c17728b6589.html 一 背景知識
由檔案格式入手,來分析MS08-052漏洞, 并構造了一個可以使沒有更新檔的程式崩潰的圖檔,
1 WMF檔案結構
--------------------------|
| 檔案頭 |
|-------------------------|
| 檔案記錄 |
|-------------------------|
|-------------------------|
| 檔案記錄 |
|-------------------------|
|-------------------------|
| 檔案記錄 |
|-------------------------|
windows中檔案頭結構如下
typedef struct
{
INT16 Left;
INT16 Top;
INT16 Right;
INT16 Bottom;
} PWMFRect16;
typedef struct
{
UINT32 Key; // GDIP_WMF_PLACEABLEKEY
INT16 Hmf; // Metafile HANDLE number (always 0)
PWMFRect16 BoundingBox; // Coordinates in metafile units
INT16 Inch; // Number of metafile units per inch
UINT32 Reserved; // Reserved (always 0)
INT16 Checksum; // Checksum value for previous 10 WORDs
} WmfPlaceableFileHeader;
typedef struct tagMETAHEADER
{
WORD mtType; // 01 磁盤
WORD mtHeaderSize; // 0x0009 頭大小9個word
WORD mtVersion;
DWORD mtSize; // 不算WmfPlaceableFileHeader頭的檔案大小
WORD mtNoObjects;
DWORD mtMaxRecord;
WORD mtNoParameters;
} METAHEADER;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL2dlb3IWWjl2S5dFTlZjNzgzN0QjM2IWMwQmZlVGOjRzX1ITOwgDMwIzLcNHduVWboNWY0RXYvwVbvNmLw92Y1NnLzJmYvw1LcpDc0RHaiojIsJye.jpg)
圖 1.1 檔案頭
檔案記錄由 檔案記錄大小(4位元組) 檔案記錄類型(2位元組) 檔案記錄體組成,其中0x0538類型是polypolygon類型,正是對這個記錄的處理不當導緻的溢出, 該記錄的結構如下
記錄大小
記錄類型
polygon個數(假設為x)
第1個polygon的點數(y個) 第2個polygon點數 ....第x個polygon的點數 .
第1個polygon的第1個點 第1個polygon的第2個點....第1個polygon的第y個點
...............
第x個polygon的第1個點 .................................第x個polygon的最後1個點
由圖1.2看出該記錄的大小為0x73個word長度. 該記錄類型是0x0538 該記錄中polygon的個數為1 , polygon的點數為0x37, 後面0x37個word長度的資料就是該polygon的點. 想要讀取該記錄則要先配置設定空間,但并不是根據0x73來配置設定的,而是根據polygon的個數,及每個polygon的點數相加來配置設定空間.
圖 1.2 polypolygon記錄
二 漏洞部分代碼
圖2.1 具有漏洞的代碼
圖2.2 微軟修補後的代碼
除了判斷是否小于0 還有判斷是否加過了溢出了
三 WMF檔案構造
構造了一個wmf檔案polypoygon記錄, 用極大的polygon個數和每個polygon的點數都很大, 使其計算達到整數溢出,使用沒有更新檔的gdiplus的程式檢視該檔案,就可以直接崩潰, , 測試圖檔連接配接 http://bbs.antiy.cn/viewthread.php?tid=1087&extra=page%3D1&frombbs=1 無木馬. 呵呵 無木馬. 呵呵
四解決方案
有漏洞的趕快打更新檔吧 http://www.antiy.com/cn/download/agdifix.htm
五 總結
圖形檔案格式是由很多 “ 段 ” 構成的資料流,而每個段由 :長度, 類型 ,參數,資料等結構構成,在程式解析這些檔案格式的時候會依據 “類型 ” 來确認段,并讀取參數 ” 進行一定的運算,再依據這些參數來處理随後緊跟的 “ 資料 ” 。漏洞的産生原因就是在對參數進行運算的時候相信了檔案輸入的參數沒有進行确認而導緻的。除了圖形檔案格式外 excel 的 biff 格式也是一樣的由段的頭決定後續資料的讀取,且有可變資料對象。有輸入就有危險.
六 參考文獻
[1] GDI+ 中的漏洞可能允許遠端執行代碼 ( http://www.microsoft.com/china/technet/security/bulletin/MS08-052.mspx
[2] Microsoft GDI+ WMF PolyPolygon Record Parsing Integer Overflow http://secunia.com/binary_analysis/sample_analysis/ 2008
[3] Wmf http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/WindowsMetafileFormat(wmf)Specification.pdf 2008