其他分享
首页 > 其他分享> > writeUp-攻防世界-reverse-Hello,CTF

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。

 

标签:reverse,esp,writeUp,v10,char,CTF,ebp,v13,v4
来源: https://www.cnblogs.com/cloud-tree/p/11566811.html