首页
论坛
专栏
课程

[原创]看雪CTF 2019Q3 第五题 魅影舞姬

2019-9-21 17:16 2505

[原创]看雪CTF 2019Q3 第五题 魅影舞姬

2019-9-21 17:16
2505

题目分析

  1. 往输入后面追加一段字符串Welcome/to/this/very/simple/challenge,输入的字符串加上这段内容大小不能超过0x55
    图片描述

  2. 调用btea加密算法验证输入的正确性
    图片描述

  3. 将输入的内容做base64解码,若输入中有等号且等号位置小于等于35,则只解析等号及前面的数据,否则只解析前36位数据
    图片描述

    图片描述

  4. 将输入的base64字符串分成0-88-1616-24,再分出base64解码后的18位之后的部分
    图片描述

  5. 有两个加解密函数,猜测是魔改des,因为搜其使用的数据表搜到了看雪很早前的一篇破解魔改des的文章,怀疑是作者留下的线索。在这里暂且称f_des_opt_01为加密函数,f_des_opt_02为解密函数
    图片描述

  6. 根据上图可以看出:
    先将base64解码的数据18位以后的数据用base64字符串的16-24位的数据作为key加密;
    18位以后的数据用8-16位的数据作为key解密;
    18位以后的数据用0-8位的数据作为key加密;

  7. 有了以上的推断,当需要反推数据时,直接调试,替换加解密函数的参数就可以反向操作了

  8. 然后就是走迷宫的操作了,识别迷宫是通过找到迷宫字符串数据后,结合使用时采用map[][13]二维数组的方式,推测出是迷宫地图
    图片描述
    图片描述

  9. 使用MD5校验放多解

找出迷宫

1. 在main函数前利用全局变量注册了一个初始化函数,里面给第一个迷宫赋值,并且也给防多解用的md5字符串赋值

图片描述

2. 迷宫走法

图片描述

3. 通过调试抓出几次变换后的迷宫,一共四组,结合上面的代码可以看出,@代表移动的对象,#代表终点

1
*************
*@***********
*-***********
*--**----****
*-***-**-****
*-***#**-****
*--*****-****
**-*****-****
**-------****
**-*-----****
**---**-*****
**-****--****
*************
2
*************
*@***********
*-***********
*-***-**-****
*--**----****
*-***#**-****
*--*****-****
**-*****-****
**-*-----****
**---**-*****
**-------****
**-****--****
*************
3
*************
*@***********
*-***********
*-***-**-****
*--*****-****
*-***#**-****
*--**----****
**-*****-****
**-****--****
**---**-*****
**-*-----****
**-------****
*************
4
*************
**-------****
*--*****-****
*-***-**-****
*--*****-****
*-***#**-****
*-***-**-****
*-***-**-****
*--**----****
**---**-*****
*--*****-****
*@***********
*************

4. 找出四组迷宫的走法

0 上
1 下
2 左
3 右
第1次
1111
1311
3333
3300
0002
2211
// 55 75 FF F0 02 A5
第2次
1111
1311
1330
3333
0000
2221
// 55 75 7C FF 00 A9
第3次
1111
1311
1331
3330
0300
2220
// 55 75 7D FC 30 A8
第4次
0300
2000
0003
0333
3331
1111
1122
2000
// 30 80 03 3F FD 55 5A 80

反推答案

  1. 由前面的拆分和加解密可得知,输入的base64字符串的前24位是不变的,需要变化的是24位之后的数据

  2. 将第四组迷宫的走法数据和每次对应的分解出的key数据整理出来,调试时按照相反操作放入到魔改des的加解密操作函数中,执行的结果就是反推出的数据;具体操作就不截图了,反推结果如下

    key                data
    VXX/8AKl   30 80 03 3F FD 55 5A 80  解密
    VXV8/wCp   3F 33 22 50 73 E7 DE 50  加密
    VXV9/DCo   A7 E9 5A 25 48 CA 28 96  解密
    ==>
    81 E5 8A 24 CB 6B 99 E6
    
  3. base64_encode(第一组迷宫的走法数据 + 第二组迷宫的走法数据 + 第三组迷宫的走法数据 + 解密后的数据) = key

    55 75 FF F0 02 A5 55 75 7C FF 00 A9 55 75 7D FC 30 A8 81 E5 8A 24 CB 6B 99 E6
    VXX/8AKlVXV8/wCpVXV9/DCogeWKJMtrmeY=
    

    图片描述



[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-9-25 14:51 被KevinsBobo编辑 ,原因:
上传的附件:
最新回复 (7)
丿feng 3 2019-9-25 10:27
2
0
des3就是标准的des3,想魔改的但未果(逃
KevinsBobo 7 2019-9-25 10:29
3
0
丿feng des3就是标准的des3,想魔改的但未果(逃
经验不足,没研究过加密算法,遇到了,只知道去搜特征,没搜到就认为是魔改的了。反正加密解密的他都写了,就没深入了
DlyWtF700 2019-9-25 10:30
4
0
楼上的是题主吗。。。哈哈
KevinsBobo 7 2019-9-25 10:31
5
0
DlyWtF700 楼上的是题主吗。。。哈哈
果然是题主
nevinhappy 2 2019-9-25 11:05
6
0
DES处理部分不太理解,对于F5的结果是:
```
      fuck_Func_01(&Dest, &v21, &Dest);
      fuck_Func_02(&Dest, &v22, &Dest);         // 算法,给Dest值;
      v38_length = strlen(Str);
      md5(&v20_md5Hash, Str, v38_length);       // md5 ...对输入的字符进行处理。
      fuck_Func_01(&Dest, &v23, &Dest);
```
其中通过迷宫逆向得到了:
Dest = ['0x30', '0x80', '0x3', '0x3f', '0xfd', '0x55', '0x5a', '0x80']
输入的SN前部分为:VXX/8AKlVXV8/wCpVXV9/DCo
 v21 = UserInput[16, 8]; = "VXV9/DCo" fuck_Func_01(&Dest, &v21, &Dest);
 v22 = UserInput[8, 8];  = "VXV8/wCp" fuck_Func_02(&Dest, &v22, &Dest); 
 v23 = UserInput[0, 8];  = "VXX/8AKl" fuck_Func_01(&Dest, &v23, &Dest);
怎么得到Key :81 E5 8A 24 CB 6B 99 E6  ?
nevinhappy 2 2019-9-25 11:21
7
0
好像明白了,其实就是DES3对称加密,上面的三步v21,v22, v23的逆过程:
让Dest =  ['0x30', '0x80', '0x3', '0x3f', '0xfd', '0x55', '0x5a', '0x80']
fuck_Func_02(&Dest, &v23, &Dest);
fuck_Func_01(&Dest, &v22, &Dest);
fuck_Func_02(&Dest, &v21, &Dest);
得到的Dest为Base64后的input[18 :] 结果;
最后于 2019-9-26 08:58 被nevinhappy编辑 ,原因:
KevinsBobo 7 2019-9-25 11:28
8
0
nevinhappy 好像明白了,其实就是DES3对称加密,上面的三步v21,v22, v23的逆过程: 让Dest = ['0x30', '0x80', '0x3', '0x3f', '0xfd', '0x55', ...
对的,就是这样,你这函数名也是厉害,f**k,哈哈哈
游客
登录 | 注册 方可回帖
返回