CVE-2010-0265分析 Microsoft Movie Maker - Remote Code Execution (MS10-016)
相關鏈接:https://www.exploit-db.com/exploits/14886/
環境介紹:XP Professional sp 3 Movie Maker 2.1.4026.0
漏洞描述:
https://technet.microsoft.com/zh-cn/library/security/ms10-016.aspx
官方說明了是一個緩沖區溢出漏洞且2.1版本是受漏洞影響的。
重現漏洞:
下載文章中提供的壓縮包,打開Movie Maker,用windbg attach後加載exploit.mswmm文件。斷在了這裏(沒斷在這也算正常)
由於ecx已經被覆蓋為0x90909090,所以調用虛函數時導致了異常。查看函數調用堆棧,觀察之前的執行流程。
順便用IDA打開漏洞模塊,便於後續分析。
在IDA中定位CDocManager::ExtractData函數中的奔潰的地址,ecx = [eax] = [var_10] ,向上瀏覽代碼var_10來自於CDocManager::GetStream,也可以在CrashPoint 按F5進行跟蹤。
對01180BC8處下斷用windbg重新調試,重新調試發現異常的位置不對了而且很難重現之前的異常情況,然後就開始找原因。給MessageBox下斷查看調用堆棧發現流程是一樣的,只是不觸發異常。
這裏我就開始想錯了,考慮成了流程一致,結果不一致,往輸入不一致的方向考慮了。然後就各種找原因,比如刪除臨時文件之類的。最後一無所獲,只能回來重新分析之前那個異常。沒有想到堆溢出,因為溢出的位置會導致流程不一樣。所以也會有各種不同的異常出現。所以對異常處的分析應該更多一點,應該盡早確認出是一個堆溢出。
根據調用堆棧,先根據CDocManager::ExtractData的返回地址 0118155f 對 0118155A 下斷,因為 CDocManager::Extract 函數會調用多次。斷下後
再對01180BC8處下斷,var_10是一個IStream指針,斷下後查看還是空的。執行完CDocManager::GetStream後就有值了。
執行前:
執行後:
異常的原因就是這個對象的虛表變成了0x90909090,繼續跟蹤下去。
到達 CDocManager::CSmartStream::Read 讀取相關的函數,讀取的數據大小為0x1111,那麽肯定有一個存放數據的buffer,查看該函數的參數。跟進後發現該函數調用了ole32!CExposedStream::Read 且IDA提示參數2是個指針。記錄下執行前後的數據,發現確實寫入了數據。
跟蹤該參數來源,在上層函數中發現該參數來自於堆。
查看該地址的相關信息,發現該堆塊大小只有0x20,而復制的大小有0x1111導致堆溢出。
CVE-2010-0265分析 Microsoft Movie Maker - Remote Code Execution (MS10-016)