<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/binary/5147

            0x00 前言


            分析某程序配置文件的格式以解密加密數據。

            需要分析的文件為../config/ADF-Server.srv文件。先使用WinHex打開文件先看看有啥內容。

            說實話,由于經驗不足其實也沒看出啥,我猜吧0x~0x30為字符串信息,0x40~0xC0也是一段字符串。然后就是一些零散的數據了。哦,中間還有段網址端口。然后0x15C~文件尾都是一些加密數據了。至于目測就這樣吧。。。打開程序來玩玩。

            enter image description here

            0x01 分析


            打開程序后彈出了一個對話框,是需要登陸的。發現登陸信息中有config目錄下的ADF-Server.srv文件。那么肯定在程序運行時會加載ADF-Server.srv文件。

            enter image description here

            enter image description here

            不過還是想試試吧config下的所有ADF-ServerX.srv刪除掉呢?保存后刪除ADF-ServerX.srv除了一個默認的ADF-Server.srv其余的都沒有了。

            enter image description here

            好吧,知道會讀取ADF-Server.srv文件后那么問題來了。我沒有登錄密碼。。。好吧,取消后隨便看看。在文件中找到了注冊的地方。那就注冊個新賬戶吧。。找到地方后注冊時發現有個選擇服務器,里面的內容有點眼熟啊。。

            enter image description here

            誒,ADF-Server.srv文件中0x0~0x30不就是地址字符串么,0x40~0xB0不就是公司么。。我把ADF-Server.srv的地址改成HENGHENG,公司名改成HAHA試試。。

            enter image description here

            enter image description here

            那么可以證明0x00~0x30保存的是地址字符串,0x40~0xB0保存的是公司字符串。

            0x02 開始調試


            注冊號賬戶后感覺也沒啥看頭了。那么這樣吧,既然會讀文件那么那么可以開始動態調試了。

            用OD載入,對CreateFile的參考斷點,但是在進程基址上CTRL+N中查找CreateFile只能找到A版本沒有W版本。當時我對A版本下參考斷點沒用,斷下后打開的也不是我想要的打開文件。這明顯不科學,由于經驗不足想了一會兒才想記起從哪看到的提升是“函數皆可W斷下來”也就是對CreateFileW下斷點。CreateFileW在Kernel32.dll中,對著Kernel32.dll,Ctrl+N查找CreateFileW,沒有參考斷點那么就直接在函數頭int3。斷下來之后F9,并且觀察棧空間記錄的打開文件的第一個參數字符串。

            enter image description here

            找到需要查看打開的文件后往下翻滾棧到最后,找到返回地址。調用的是fopen()。。C庫函數。。。。

            enter image description here

            enter image description here

            程序打開成功, 返回值不為0。走CALL 004C2E90這個函數。傳遞參數0x160。這個CALL內就是調用了mallo()申請一塊0x160大小的內存空間。(我就不抓圖了)。既然申請了空間那么肯定要讀文件的,這會兒知道了是使用C庫函數來對文件操作那么可以直接對fread()來下參考斷點了。下好斷點后就直接F9。

            enter image description here

            fread(ReadBuff, Length, ReadSize, pFile);

            enter image description here

            enter image description here

            只讀取了上面差不多文件的一半吧。。既然只讀這么多那么肯定是有用的。對內存下訪問斷點。斷下后會對這些進行操作,其中ESI是BuffHead。

            #!bash
            0042CB53  |> \8A06          |mov     al, byte ptr [esi]
            0042CB55  |.  885E 3F       |mov     byte ptr [esi+3F], bl
            0042CB58  |.  3AC3          |cmp     al, bl
            0042CB5A  |.  889E BF000000 |mov     byte ptr [esi+BF], bl
            0042CB60  |.  889E 17010000 |mov     byte ptr [esi+117], bl
            0042CB66  |.  899E D0000000 |mov     dword ptr [esi+D0], ebx
            0042CB6C  |.  899E 5C010000 |mov     dword ptr [esi+15C], ebx
            

            上面這些步驟對內存中0xD0,以及0X15C以及其他的地方清0。其余的+0xXX都在文件中是以0存放,那么在文件中0xD0以及0x15C兩處數據是無用的。然后繼續往下跟

            enter image description here

            這段代碼表示取0x4D位置的數據取出,并且判斷它是否小于1或大于0x40。如果在這兩個范圍外則跳走,否則進行運算后調用下面的CALL。

            CALL內調用malloc()來申請堆空間,申請對空間的大小為0x460。這個0x460是對內存中0xD4位置取出來的值為0x7,進行運算后計算出來的結果。得知申請的內存地址為:0x10EA070然后繼續F9。

            (補: 忘記了一步,所以這里的內存地址與下面的內存地址不同。)

            將申請的內存地址存入了0xD0的位置,然后繼續F9

            enter image description here

            在0042CBE1處讀取了0xD4,并且使用這個參數調用fread。那么Buff為EAX寄存器保存。通過OD插件提供的跳轉的紅線。得知是從上一步申請內存成功后跳轉過來的。

            enter image description here

            fread(eax(Buff), 0x460(Length), 1, pFile(77CXXX))讀文件,77CXXX為打開ADF-Server.srv的文件指針,這次讀取的長度為0x460(0xD4位置的值并且通過運算得出)。讀取的內容為。

            enter image description here

            在文件中的內容為0x160偏移開始。并且從0x160開始到文件尾剛好是0x460大小。

            enter image description here

            那么我可以理解為,0x4D這里記錄的數值是通過運算得出的是從0x160~EOF的大小。上面說了這里面有加密的內容。

            那么讀取完文件余下部分后,對于加密數據肯定是會需要進行解密的。解密要么就在當前讀取的Buff中直接解密,要么就先將數據拷貝到一個新的Buff中在對新Buff內容進行解密。要做這兩個操作就需要對內存進行修改或者訪問。那么這里我的想法是先對這塊內存下內存寫入。如果沒有操作在對其進行內存訪問。

            下完內存寫入斷點后F9。到了某個小函數中停止了

            enter image description here

            貌似我運氣是很好的,這段函數中我不停的F8,發現會從BuffHead開始從BuffHead循環取單字節值后進行運算得出結果并且復寫回Buff中,而且寫入的新數據貌似還是很有用的數據。既然這樣的話我直接在循環結束為止下個int3,F9直接看結果。

            enter image description here

            解密出來還是很有規律的,從IP開始到下一段IP開始一個段中的大小為0xA0,并且我數了數剛好有7塊。

            enter image description here

            那么我能猜到,文件中0xD4這里記錄的7是從文件0x160~EOF總共數據有7塊。并且每塊大小為0xA0。總長度為0x460(當然這里總長度是通過取0x4D的7然后對齊:(7+7*4)<< 5的計算的出來的。那么解密的函數為文章的目前位置倒數第三張圖片。

            總結一下對ADF-Server.srv的結果分析

            0x0~0x3F:為服務器名稱
            0x40~0xCF:為公司名稱
            0xD0:文件中沒用,內存中記錄了讀取文件0x160~E0F內存地址的Buff
            0xD4:記錄了0x160~E0F的長度(通過(7+7*4)<<5獲得)并且還是解密數據后塊的數量,每塊數量0xA0
            0xD8~0xEF:網站以及端口號。
            0x118:并沒有使用
            0x15C:文件中沒有使用,內存中清0
            0x160~EOF:被加密的數據。
            

            0x03 結語


            得知解密函數后那么還得逆向一下解密函數時如何解密的。不過看樣子解密函數是非常簡單的。最主要的就是0x56B734地址內的內容了。

            enter image description here

            enter image description here

            enter image description here

            上面就是解密函數逆向后的內容,并且測試成功過。

            文章就到這里結束吧。。。。ByBy

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

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

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

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

                      亚洲欧美在线