/*
*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個字符的反彙編代碼。
圖1
繼續一步步調試,圖2所示爲判斷輸入的字符,如果有符號和數字,則跳轉到失敗,結束程序,如果爲純字母的繼續執行驗證。
圖2
圖3爲對輸入的key進行加密
圖3
圖4爲我們輸入的key與程序的key驗證,如果一一對應,則成功,否則失敗。
圖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
注:更多文章,請關注我的個人網站