下載附件,附件爲exe的可執行文件,第一步查殼。python
發現爲nsPack殼,可採用脫殼機或者手動脫殼的方式進行脫殼。ide
在此採用手動脫殼的方式,增長本身對脫殼流程的理解,並熟練相關操做。學習
ESP定律脫殼this
將程序拖入ODspa
發現pushfd和pushad兩句關鍵句。3d
F8單步執行到call語句,ESP變化,在ESP上右鍵,添加斷點。code
F9執行程序blog
執行到popfd,且下一條命令爲一個很長距離的跳轉,根據北斗殼的特色,極可能跳轉至OEP。字符串
F8單步執行到以下位置get
觀察代碼 00401336 爲程序的OEP
利用PETools獲取轉存
利用 ImportREC 修復IAT
脫殼後的程序可以正確運行
對脫殼後的程序進行查殼
查詢結果殼已經脫掉,脫殼操做完畢。
將程序拖入IDA分析
int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // eax char Buf; // [esp+4h] [ebp-38h] char Dst; // [esp+5h] [ebp-37h] Buf = 0; memset(&Dst, 0, 0x31u); printf("Please Input Flag:"); gets_s(&Buf, 0x2Cu); if ( strlen(&Buf) == 42 ) { v4 = 0; while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] ) { if ( ++v4 >= 42 ) { printf("right!\n"); goto LABEL_8; } } printf("error!\n"); LABEL_8: result = 0; } else { printf("error!\n"); result = -1; } return result; }
在while語句中,對輸入字符串進行異或運算,利用異或運算特殊的可逆性。將byte_402130與dword_402150進行異或,便可獲得正確答案。
byte_402130處須要模16 循環取值。
編寫python腳本
string_1 = "this_is_not_flag" string_2 = [0x12, 4, 8, 0x14, 0x24, 0x5c, 0x4a, 0x3d, 0x56, 0xa, 0x10, 0x67, 0, 0x41, 0, 1, 0x46, 0x5a, 0x44, 0x42, 0x6e, 0x0c, 0x44, 0x72, 0x0c, 0x0d, 0x40, 0x3e, 0x4b, 0x5f, 2, 1, 0x4c, 0x5e, 0x5b, 0x17, 0x6e, 0xc, 0x16, 0x68, 0x5b, 0x12, 0x48, 0x0e] flag = "" for i in range(42): flag += chr(string_2[i] ^ ord(string_1[i % 16])) print(flag)
輸出:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
解題完畢!
收穫:熟悉手動脫殼操做,解題完畢後,在網上查找資料學習各類殼的手動脫殼流程,對加殼脫殼有更加深刻的瞭解。
部分資料:ximo脫殼基礎 連接: https://pan.baidu.com/s/1zkE0zMgsMFBA5RawEajjOQ 提取碼: wf2y