Reverse 高校网络信息安全运维挑战赛

Reverse 高校网络信息安全运维挑战赛

  1 signed int sub_403CC0()
  2 {
  3   unsigned int v0; // eax
  4   int key_lens; // eax
  5   FILE *v2; // eax
  6   FILE *v3; // eax
  7   signed int result; // eax
  8   int data; // [esp+10h] [ebp-44h]
  9   int v6; // [esp+14h] [ebp-40h]
 10   int v7; // [esp+18h] [ebp-3Ch]
 11   int v8; // [esp+1Ch] [ebp-38h]
 12   int v9; // [esp+20h] [ebp-34h]
 13   int v10; // [esp+24h] [ebp-30h]
 14   int v11; // [esp+28h] [ebp-2Ch]
 15   int v12; // [esp+2Ch] [ebp-28h]
 16   int mykey[8]; // [esp+30h] [ebp-24h]
 17 
 18   sub_401AD0();
 19   data = 'F2A1';                                // 1A2F943C4D8C5B6EA3C9BCAD7E
 20   v6 = 'C349';
 21   v0 = 0;
 22   v7 = 'C8D4';
 23   v8 = 'E6B5';
 24   v9 = '9C3A';
 25   v10 = 'DACB';
 26   v11 = 'E7';
 27   v12 = 0;
 28   do
 29   {
 30     mykey[v0] = 0;
 31     ++v0;
 32   }
 33   while ( v0 < 8 );
 34   puts("input your key:");
 35   scanf("%s", mykey);
 36   key_lens = strlen((const char *)mykey);
 37   if ( key_lens <= 19 )
 38   {
 39     printf("too short!");
 40     result = -1;
 41   }
 42   else if ( key_lens > 30 )
 43   {
 44     printf("too long!");
 45     result = -1;
 46   }
 47   else
 48   {
 49     if ( check_4014A0((char *)mykey, (char *)&data, key_lens) )
 50       printf("congratulations, your input is the flag ^_^");
 51     else
 52       printf("try agian");
 53     v2 = (FILE *)((char *)iob[1] - 1);
 54     iob[1] = v2;
 55     if ( (signed int)v2 < 0 )
 56     {
 57       filbuf(iob[0]);
 58       v2 = iob[1];
 59     }
 60     else
 61     {
 62       ++iob[0];
 63     }
 64     v3 = (FILE *)((char *)v2 - 1);
 65     iob[1] = v3;
 66     if ( (signed int)v3 < 0 )
 67       filbuf(iob[0]);
 68     else
 69       ++iob[0];
 70     result = 0;
 71   }
 72   return result;
 73 }signed int sub_403CC0()
 74 {
 75   unsigned int v0; // eax
 76   int key_lens; // eax
 77   FILE *v2; // eax
 78   FILE *v3; // eax
 79   signed int result; // eax
 80   int data; // [esp+10h] [ebp-44h]
 81   int v6; // [esp+14h] [ebp-40h]
 82   int v7; // [esp+18h] [ebp-3Ch]
 83   int v8; // [esp+1Ch] [ebp-38h]
 84   int v9; // [esp+20h] [ebp-34h]
 85   int v10; // [esp+24h] [ebp-30h]
 86   int v11; // [esp+28h] [ebp-2Ch]
 87   int v12; // [esp+2Ch] [ebp-28h]
 88   int mykey[8]; // [esp+30h] [ebp-24h]
 89 
 90   sub_401AD0();
 91   data = 'F2A1';                                // 1A2F943C4D8C5B6EA3C9BCAD7E
 92   v6 = 'C349';
 93   v0 = 0;
 94   v7 = 'C8D4';
 95   v8 = 'E6B5';
 96   v9 = '9C3A';
 97   v10 = 'DACB';
 98   v11 = 'E7';
 99   v12 = 0;
100   do
101   {
102     mykey[v0] = 0;
103     ++v0;
104   }
105   while ( v0 < 8 );
106   puts("input your key:");
107   scanf("%s", mykey);
108   key_lens = strlen((const char *)mykey);
109   if ( key_lens <= 19 )
110   {
111     printf("too short!");
112     result = -1;
113   }
114   else if ( key_lens > 30 )
115   {
116     printf("too long!");
117     result = -1;
118   }
119   else
120   {
121     if ( check_4014A0((char *)mykey, (char *)&data, key_lens) )
122       printf("congratulations, your input is the flag ^_^");
123     else
124       printf("try agian");
125     v2 = (FILE *)((char *)iob[1] - 1);
126     iob[1] = v2;
127     if ( (signed int)v2 < 0 )
128     {
129       filbuf(iob[0]);
130       v2 = iob[1];
131     }
132     else
133     {
134       ++iob[0];
135     }
136     v3 = (FILE *)((char *)v2 - 1);
137     iob[1] = v3;
138     if ( (signed int)v3 < 0 )
139       filbuf(iob[0]);
140     else
141       ++iob[0];
142     result = 0;
143   }
144   return result;
145 }

关键函数check_4014A0((char *)mykey, (char *)&data, key_lens)

 1 signed int __cdecl check_4014A0(char *mykey, char *data, int key_lens)
 2 {
 3   unsigned int v3; // ebx
 4   int j; // eax
 5   int k; // ebx
 6   char v7; // dl
 7   int i; // eax
 8   char v9; // [esp+Ah] [ebp-4Ah]
 9   char v10; // [esp+Bh] [ebp-49h]
10   char v11; // [esp+Ch] [ebp-48h]
11   char v12; // [esp+Dh] [ebp-47h]
12   char v13; // [esp+Eh] [ebp-46h]
13   char v14; // [esp+Fh] [ebp-45h]
14   char v15; // [esp+10h] [ebp-44h]
15   char v16; // [esp+11h] [ebp-43h]
16   char v17; // [esp+12h] [ebp-42h]
17   char v18; // [esp+13h] [ebp-41h]
18   char v19; // [esp+14h] [ebp-40h]
19   char v20; // [esp+15h] [ebp-3Fh]
20   char v21; // [esp+16h] [ebp-3Eh]
21   char v22; // [esp+17h] [ebp-3Dh]
22   char v23; // [esp+18h] [ebp-3Ch]
23   char v24; // [esp+19h] [ebp-3Bh]
24   char v25; // [esp+1Ah] [ebp-3Ah]
25   char v26; // [esp+1Bh] [ebp-39h]
26   char v27; // [esp+1Ch] [ebp-38h]
27   char v28; // [esp+1Dh] [ebp-37h]
28   char v29; // [esp+1Eh] [ebp-36h]
29   char v30; // [esp+1Fh] [ebp-35h]
30   char v31; // [esp+20h] [ebp-34h]
31   char v32; // [esp+21h] [ebp-33h]
32   char v33; // [esp+22h] [ebp-32h]
33   int v34; // [esp+24h] [ebp-30h]
34   char v35[44]; // [esp+28h] [ebp-2Ch]
35 
36   v3 = 0;
37   v34 = 0;
38   do
39   {
40     *(_DWORD *)(&v11 + v3) = 0;
41     v3 += 4;                                    // 置零初始化
42   }
43   while ( v3 < ((&v9 - &v11 + 30) & 0xFFFFFFFC) );// <28
44   v9 = 0xF;                      //encryptArray
45   v10 = 0x87u;
46   v11 = 0x62;
47   v12 = 0x14;
48   v13 = 1;
49   v14 = 0xC6u;
50   v15 = 0xF0u;
51   v16 = 33;
52   v17 = 48;
53   v18 = 17;
54   v19 = 80;
55   v20 = 0xD0u;
56   v21 = 0x82u;
57   v22 = 35;
58   v23 = 0xAEu;
59   v24 = 35;
60   v25 = 0xEEu;
61   v26 = 0xA9u;
62   v27 = 0xB4u;
63   v28 = 82;
64   v29 = 120;
65   v30 = 87;
66   v31 = 12;
67   v32 = 0x86u;
68   v33 = 0x8Bu;                                  // 0F 87 62 14 01 C6 F0 21 30 11 50 D0 82 23 AE 23 EE A9 B4 52 78 57 0C 86 8B
69                                                 // 
70                                                 // 
71   if ( key_lens == 25 )
72   {
73     j = 0;
74     do
75     {
76       v35[j] = __ROL1__(mykey[j], 2);           // 循环左移2位
77       ++j;
78     }
79     while ( j != 25 );
80     k = 0;
81     do
82     {
83       v35[k] ^= numb_401460(data, k);           // data:(ASCII "1A2F943C4D8C5B6EA3C9BCAD7E")
84                                                 // numb函数根据data、k生成一系列数,
85                                                 // 
86       ++k;
87     }
88     while ( k != 25 );
89     v7 = 15;
90     for ( i = 0; v35[i] == v7; v7 = *(&v9 + i) )//关键比较,v35存储内容:(key循环左移2位 异或 numb数据)      结果与encryptArray比较
91     {
92       if ( ++i == 25 )
93         return 1;
94     }
95   }
96   return 0;
97 }
numb_401460(data, k)函数:
int __cdecl sub_401460(char *data, int index)
{
  char a; // al
  char b; // cl
  int x; // eax
  int y; // edx 1A2F943C4D8C5B6EA3C9BCAD7E

  a = data[index];
  b = data[index + 1];
  if ( (unsigned __int8)(a - 0x30) > 9u )
    a -= 0x37;
  x = a & 0xF;
  y = (b - 0x37) & 0xF;
  if ( (unsigned __int8)(b - 0x30) <= 9u )
    y = b & 0xF;
  return y | 16 * x;

‘wp:

 1 encryptArray=[0x0F, 0x87, 0x62, 0x14, 0x01, 0xC6, 0xF0, 0x21, 0x30, 0x11, 0x50, 0xD0, 0x82, 0x23, 0xAE, 0x23,0xEE, 0xA9, 0xB4, 0x52, 0x78, 0x57, 0x0C, 0x86, 0x8B]
 2 data='1A2F943C4D8C5B6EA3C9BCAD7E'
 3 numbs=[]
 4 # numbs=[0x1a, 0xa2, 0x2f, 0xf9, 0x94, 0x43, 0x3c, 0xc4, 0x4d, 0xd8, 0x8c, 0xc5, 0x5b, 0xb6, 0x6e, 0xea, 0xa3, 0x3c, 0xc9, 0x9b, 0xbc, 0xca, 0xad, 0xd7, 0x7e]
 5 
 6 # def ROLN_(val,N,n):
 7 # 假如将一个无符号的数据val,长度为N,需要循环移动n位。可以利用下面的公式:
 8     # 循环左移:(val >> (N - n) | (val << n))
 9     # 循环右移:(val << (32 - n) | (val >> n))
10 def ROL_2(val):#8字节数循环左移2位
11     return ((val>>6)&0xff)|((val<<2)&0xff)
12 def ROR_2(val):#8字节数循环右移2位
13     return ((val<<6)&0xff)|((val>>2)&0xff)
14 def numb(data,index):
15     a = ord(data[index]);
16     b = ord(data[index + 1]);
17     if ((a - 0x30) > 9):
18         a -= 0x37;
19     x = a & 0xF;
20     y = (b - 0x37) & 0xF;
21     if ((b - 0x30) <= 9):
22         y = b & 0xF;
23     return y | 16 * x;
24 
25 for i in range(25):
26     numbs.append(numb(data,i))
27 print('numbs=[',','.join(map(hex,numbs)),']')
28 
29 key=[]
30 for i in range(25):
31     x=encryptArray[i]^numbs[i]
32     x=ROR_2(x)
33     key.append(chr(x))
34 print(''.join(key))

 EIS{ea3y_r7Eve0rSe_r1ghT}

 在攻防世界中提交失败0.0,Orz

原文地址:https://www.cnblogs.com/DirWang/p/12145266.html