墨者學院 - 逆向分析實訓-exe(第1題)
OD載入
00401293 . E8 B8FEFFFF call game.00401150 跟入
00401246 |. E8 F5000000 call game.00401340 輸出函式 也跟入
在輸出完一些說明字元之後 後面還有一個call
00401394 |. E8 57FFFFFF call game.004012F0 決定跟入
一步一步往下走 便發現了一些貓膩
004012F0 /$ 55 push ebp
004012F1 |. 89E5 mov ebp,esp
004012F3 |. 57 push edi
004012F4 |. 53 push ebx
004012F5 |. 83EC 10 sub esp,0x10
004012F8 |. C70424 280000>mov dword ptr ss:[esp],0x28 ; |
004012FF |. E8 2C060000 call <jmp.&msvcrt.malloc> ; \malloc
00401304 |. FC cld
00401305 |. 89C3 mov ebx,eax
00401307 |. B9 0A000000 mov ecx,0xA
0040130C |. 31C0 xor eax,eax
0040130E |. 89DF mov edi,ebx
00401310 |. F3:AB rep stos dword ptr es:[edi]
00401312 |. 31FF xor edi,edi
00401314 |. EB 0D jmp short game.00401323 進入迴圈
00401316 |> 0FB687 003040>/movzx eax,byte ptr ds:[edi+0x403000]
0040131D |. 34 55 |xor al,0x55 進行異或運算(開始不懂異或運算,自己專門計算了一下)
0040131F |. 88041F |mov byte ptr ds:[edi+ebx],al 將轉換後的ascii碼存入移位存入ebx中
00401322 |. 47 |inc edi edi++
00401323 |> C70424 003040> mov dword ptr ss:[esp],game.00403000 ; |>0,u<&ue6gm6`7ag0e`6a61c30dfac364a0c030 這就是需要進行異或運算的字元
0040132A |. E8 F9050000 |call <jmp.&msvcrt.strlen> ; \strlen 計算的字串的長度
0040132F |. 39C7 |cmp edi,eax 判斷是否計算完畢
00401331 |.^ 72 E3 \jb short game.00401316
00401333 |. 83C4 10 add esp,0x10
00401336 |. 89D8 mov eax,ebx 迴圈結束之後ebx儲存的就是轉換後的key
00401338 |. 5B pop ebx
00401339 |. 5F pop edi
0040133A |. 5D pop ebp
0040133B \. C3 retn
執行一下c程式,進行27次異或 0x55運算即可
#include <stdio.h>
#include <string.h>
int main(){
int i; char key[40] ={};
char str[] = ">0,u<&ue6gm6`7ag0e`6a61c30dfac364a0c030";
for ( i = 0; i < strlen(str); ++i )
key[i] = str[i] ^ 0x55; printf("%s",key); return 0;
}