writeUp-攻防世界-reverse-Hello,CTF


先打開這個exe文件。

 

 用PEID查殼。

等等……沒有殼?!

 

 

可以看到這個程序是C++寫的。

拖到ida里查看。

搜索“please input your serial:”

 

 跳過去看看

看到這個東西在_main函數里面。

 

 F5看到偽碼:

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   signed int v3; // ebx
 4   char v4; // al
 5   int result; // eax
 6   int v6; // [esp+0h] [ebp-70h]
 7   int v7; // [esp+0h] [ebp-70h]
 8   char v8; // [esp+12h] [ebp-5Eh]
 9   char v9[20]; // [esp+14h] [ebp-5Ch]
10   char v10; // [esp+28h] [ebp-48h]
11   __int16 v11; // [esp+48h] [ebp-28h]
12   char v12; // [esp+4Ah] [ebp-26h]
13   char v13; // [esp+4Ch] [ebp-24h]
14 
15   strcpy(&v13, "437261636b4d654a757374466f7246756e");//把字符串"437261636b4d654a757374466f7246756e"復制到v13
16   while ( 1 )
17   {
18     memset(&v10, 0, 0x20u);
19     v11 = 0;
20     v12 = 0;
21     sub_40134B(aPleaseInputYou, v6);//這里調用函數sub_40134B,輸出aPleaseInputYou里的字符:"please input your serial:"
22     scanf(aS, v9);//獲取輸入字符,給v9
23     if ( strlen(v9) > 0x11 )
24       break;//v9長度大於17就退掉
25     v3 = 0;//設置v3為計數器
26     do
27     {
28       v4 = v9[v3];
29       if ( !v4 )
30         break;//v4為0x00時退掉
31       sprintf(&v8, asc_408044, v4);//asc_408044為"%x"    sprintf(&v8,"%x",v4)把v4的值的16進制發到v8
32       strcat(&v10, &v8);//連接字符串v10與v8並把得到的字符串賦值給v10
33       ++v3;//計數器增加
34     }
35     while ( v3 < 17 );
36     if ( !strcmp(&v10, &v13) )
37       sub_40134B(aSuccess, v7);//strcmp(&v10, &v13) 在v10的字符串與v13的相等時返回0
38     else
39       sub_40134B(aWrong, v7);
40   }
41   sub_40134B(aWrong, v7);
42   result = stru_408090._cnt-- - 1;
43   if ( stru_408090._cnt < 0 )
44     return _filbuf(&stru_408090);
45   ++stru_408090._ptr;
46   return result;
47 }

所以說正確的serial就是"437261636b4d654a757374466f7246756e"轉化為字符串。

 

 成功得到flag。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM