buuctf-SimpleRev

文件链接:https://pan.baidu.com/s/15ojPMVsasx3EZ9s5wVQqEw 提取码:icjp

0x01 使用EFPE查看文件

 

 

没有加壳,64位文件

 

0x02 使用IDA打开文件,查看main函数,F5反编译

 

 

0x03 查看 Decry()函数

 1 __int64 Decry()
 2 {
 3   char *v0; // rax@1
 4   char v2; // [sp+Fh] [bp-51h]@19
 5   int v3; // [sp+10h] [bp-50h]@1
 6   signed int v4; // [sp+14h] [bp-4Ch]@1
 7   signed int i; // [sp+18h] [bp-48h]@1
 8   signed int v6; // [sp+1Ch] [bp-44h]@1
 9   char src[8]; // [sp+20h] [bp-40h]@1
10   __int64 v8; // [sp+28h] [bp-38h]@1
11   int v9; // [sp+30h] [bp-30h]@1
12   __int64 v10; // [sp+40h] [bp-20h]@1
13   __int64 v11; // [sp+48h] [bp-18h]@1
14   int v12; // [sp+50h] [bp-10h]@1
15   __int64 v13; // [sp+58h] [bp-8h]@1
16 
17   v13 = *MK_FP(__FS__, 40LL);
18   *(_QWORD *)src = 357761762382LL;  //选中之后H键转换16进制为0x534C43444ELL,数据在内存中是小端顺序,高位在高地址处,低位在低地址处,故实际的字符顺序应为'0x4e44434c53'经过16字符转换为ASCII码转换后字符为'NDCLS'
19                       
20   v8 = 0LL;
21   v9 = 0;
22   v10 = 512969957736LL; //同上,转换后查询Ascii码为"wodah"
23   v11 = 0LL;
24   v12 = 0;
25   LODWORD(v0) = join(key3, &v10); //在main页面v3='kills',v10=’wodah‘,这个函数就是把v3和v10两个字符串相拼接'killshadow'
26   text = v0;
27   strcpy(key, key1);  //strcpy函数就是让key1的值('ADSFK')赋予key
28   strcat(key, src);  //strcat函数就是让src的值拼接到key后面也就是'ADSFKNDCLS'
29   v3 = 0;
30   v4 = 0;
31   getchar(); //清空缓冲区
32   v6 = strlen(key); //v6的长度等于keyu,v6=10
33   for ( i = 0; i < v6; ++i )
34   {
35     if ( key[v4 % v6] > 64 && key[v4 % v6] <= 90 ) //将大写字母转换为小写字母
36       key[i] = key[v4 % v6] + 32;                  //’adsfkndcls‘
37     ++v4;
38   }
39   printf("Please input your flag:", src);
40   while ( 1 )
41   {
42     v2 = getchar();
43     if ( v2 == 10 )
44       break;
45     if ( v2 == 32 )
46     {
47       ++v3;
48     }
49     else
50     {
51       if ( v2 <= 96 || v2 > 122 )     //如果输入的v2不是小写字母
52       {
53         if ( v2 > 64 && v2 <= 90 )   //如果v2为大写字母
54           str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97;  //对srt[v3]进行处理(v3为0每次加1)//// str1[v3] = (v2-key[v4]+58)%26 + 97//变换后str2[v3]存放小写字母
55       }
56       else
57       {
58         str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; //同样处理
59       }
60       if ( !(v4 % v6) )
61         putchar(32);
62       ++v3;
63     }
64   }
65   if ( !strcmp(text, str2) )         //如果text和存储的str2相同,就成功·
66     puts("Congratulation!\n");       //text = ""killshadow"
67   else
68     puts("Try again!\n");
69   return *MK_FP(__FS__, 40LL) ^ v13;
70 }

 

分析代码以及相应的值,我们已经可以知道text以及key的值,剩下就是str2,str2就是我们想要的flag

得到flag的条件关键在于式子str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97

 

0x04 构造playload爆破**

1 text = 'killswodah'
2 key = 'adsfkslcdn'
3 flag = ''
4 for i in range(len(key)):
5      for j in range(65,122):
6          if ord(text[i]) == (j - 39 - ord(key[i % 10]) + 97) % 26 + 97:
7              flag += chr(j)
8              break
9 print(flag)

 

flag{KLDQCOZFDU}

 

posted @ 2021-04-11 20:35  原来是甘文川同学  阅读(1126)  评论(0)    收藏  举报