GCTF的re50反彙編分析

/*

*HeiTao_8k

*2015-11-17

*/

這是GCTF的Reverse比賽題目

一、工具

1、查殼Peid

2、吾愛破解版OD和IDA

二、分析過程

1、使用Peid查殼,發現是使用Microsoft Visual C++ 6.0寫的,沒有加殼。

2、在分析之前我們首先要知道這個小程序需要我幹什麼?打開re50.exe,是一個控制面板,需要我們輸入key,判斷是否正確,然後提示判斷出來的結果。老規矩輸入key:123456,結果什麼都沒提示就結束了,經過嘗試,需要輸入純字母才提示錯誤信息,那輸入key:asdfg。

3、OD和IDA結合分析,IDA載入程序,在函數窗口的函數名稱下看到 _main,這就是我們寫的主函數入口,點擊 _main,得到函數入口點爲0x00401000,然後在OD的反彙編窗口—>跟蹤表達式(快捷鍵Ctrl+G),在彈出窗口中輸入401000,確定之後跳轉到對應的地址,在0x00401000處點擊一下,按F4執行到光標處(即0x00401000),F8單步步過分析,圖1所示爲提示輸入和判斷字符是否超過20個字符的反彙編代碼。

gctf50_01

圖1

繼續一步步調試,圖2所示爲判斷輸入的字符,如果有符號和數字,則跳轉到失敗,結束程序,如果爲純字母的繼續執行驗證。

gctf50_02

圖2

圖3爲對輸入的key進行加密

gctf50_03

圖3

圖4爲我們輸入的key與程序的key驗證,如果一一對應,則成功,否則失敗。

gctf50_04

圖4

進過一步步驗證,我們終於知道key了,真正的key:gctf{bbabbJbca}

三、算法分析

靜態分析先找到一串 Key:

         eax = *”62C5J110119120L”;
先判斷了長度是否過長:

         if (ecx <= 0x14) goto loc_401097;
         loc_40107f:
        stack[2048] = “too long”;
        eax = sub_4013c0();
然後檢查了一下 gctf{} 這樣的基本結構:

        loc_4010cb:
        eax = *(int8_t *)(esp + esi + 0x18);
        if ((eax == 0x7b) || (eax == 0x7d)) goto loc_4010db;
然後把輸入的東西加了 0xCF 和上面那串 Key 做對比,其實已經重複檢查了:

        if (!COND) {
             do

             {
                    ecx = *(int8_t *)(esp + edx + 0x18);
                   *(int8_t *)(esp + edx + 0x18) = ecx + 0xcf;
                   ecx = ecx + 0xcf | 0xffffffff;
                   edx = edx + 0x1;
                   asm

                   {

                           repne scasb al, byte [es:edi]

                   };
             }

            while (edx < !ecx – 0x1);
}

於是得到了結果:

         flag: gctf{bbabbjbca}

 

下載地址

鏈接:http://pan.baidu.com/s/1qWtb5Di     密碼:ex57


注:更多文章,請關注我的個人網站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章