攻防世界 reverse 进阶 9-re1-100

9.re1-100

 1 if ( numRead )
 2       {
 3         if ( childCheckDebugResult() )
 4         {
 5           responseFalse();
 6         }
 7         else if ( bufParentRead[0] == '{' )     // 第一位
 8         {
 9           if ( strlen(bufParentRead) == 42 )    // 输入的长度为42d
10           {
11             if ( !strncmp(&bufParentRead[1], "53fc275d81", 0xAuLL) )// 输入的1-10位(输入的第2位到第11位)
12             {
13               if ( bufParentRead[strlen(bufParentRead) - 1] == '}' )// 最后一位
14               {
15                 if ( !strncmp(&bufParentRead[31], "4938ae4efd", 0xAuLL) )// 输入的31-40位
16                 {
17                   if ( !confuseKey(bufParentRead, 42) )//关键
18                   {
19                     responseFalse();
20                   }
21                   else if ( !strncmp(bufParentRead, "{daf29f59034938ae4efd53fc275d81053ed5be8c}", 0x2AuLL) )// 修改后的结果进行比较
22                   {
23                     responseTrue();             // {53fc275d81053ed5be8cdaf29f59034938ae4efd}
24                   }
25                   else
26                   {
27                     responseFalse();

主要分析confuseKey(bufParentRead, 42)函数

 1 bool __cdecl confuseKey(char *szKey, int iKeyLength)
 2 {
 3   char szPart1[15]; // [rsp+10h] [rbp-50h]
 4   char szPart2[15]; // [rsp+20h] [rbp-40h]
 5   char szPart3[15]; // [rsp+30h] [rbp-30h]
 6   char szPart4[15]; // [rsp+40h] [rbp-20h]
 7   unsigned __int64 v7; // [rsp+58h] [rbp-8h]
 8 
 9   v7 = __readfsqword(0x28u);
10   *(_QWORD *)szPart1 = 0LL;
11   *(_DWORD *)&szPart1[8] = 0;
12   *(_WORD *)&szPart1[12] = 0;
13   szPart1[14] = 0;
14   *(_QWORD *)szPart2 = 0LL;
15   *(_DWORD *)&szPart2[8] = 0;
16   *(_WORD *)&szPart2[12] = 0;
17   szPart2[14] = 0;
18   *(_QWORD *)szPart3 = 0LL;
19   *(_DWORD *)&szPart3[8] = 0;
20   *(_WORD *)&szPart3[12] = 0;
21   szPart3[14] = 0;
22   *(_QWORD *)szPart4 = 0LL;
23   *(_DWORD *)&szPart4[8] = 0;
24   *(_WORD *)&szPart4[12] = 0;
25   szPart4[14] = 0;
26   if ( iKeyLength != 42 )
27     return 0;
28   if ( !szKey )
29     return 0;
30   if ( strlen(szKey) != 42 )
31     return 0;
32   if ( *szKey != 123 )
33     return 0;
34   strncpy(szPart1, szKey + 1, 0xAuLL);          // 将输入去掉头尾{}后的部分分成4部分
35   strncpy(szPart2, szKey + 11, 0xAuLL);
36   strncpy(szPart3, szKey + 21, 0xAuLL);
37   strncpy(szPart4, szKey + 31, 0xAuLL);
38   memset(szKey, 0, iKeyLength);
39   *szKey = '{';
40   strcat(szKey, szPart3);                       // 分割后的部分重新组合
41   strcat(szKey, szPart4);
42   strcat(szKey, szPart1);
43   strcat(szKey, szPart2);
44   szKey[41] = '}';
45   return 1;
46 }

算法十分简单:

 1 s1='53fc275d81'
 2 s4='4938ae4efd'
 3 # 3,4,1,2
 4 ss='daf29f59034938ae4efd53fc275d81053ed5be8c'
 5 x=[]
 6 for i in range(0,len(ss),10):
 7     x.append(ss[i:i+10])
 8 print(x)
 9 print('{',''.join((x[2],x[3],x[0],x[1])),'}',sep='')
10 
11 # ['daf29f5903', '4938ae4efd', '53fc275d81', '053ed5be8c']
12 # {53fc275d81053ed5be8cdaf29f59034938ae4efd}

{53fc275d81053ed5be8cdaf29f59034938ae4efd}

这题实在是简单,签到题水平,竟然放到了进阶区,,,,

因为提交时没有{}

是不是很坑,

hahah

猜你喜欢

转载自www.cnblogs.com/DirWang/p/11436857.html