KCTFQ3 第五题设计思路

暑假无聊花了几个小时出了一道题,半天就被dalao秒了,tql!所幸还苟到了前九,以下的设计思路和解题思路

题目答案:VXX/8AKlVXV8/wCpVXV9/DCogeWKJMtrmeY=

设计思路:

输入一个字符串,第一个check,check长度是否小于等于48,第二个check使用了梅森翻转算法、xxtea加密算法,check字符串的第一个字节,以第一个字节作为随机数种子,由梅森翻转算法得到三个32bits整数,将第一个、第三个整数通过xxtea加密,密钥直接给出,为{0X67452301, 0XEFCDAB89, 0X98BADCFE, 0X10325476},得到的结果相加得到v,由梅森翻转算法得到的第二个整数减去v得到res,检查是否等于2768546039,梅森翻转算法得到的随机数可预测,xxtea可逆,但是sn限定字符集为[33,126],直接正向爆破秒解。第三个check,check输入的字符串与”Welcome/to/this/very/simple/challenge”相加之后的md5是否等于44e4403b63620a2075d3fb2e0a6207d2,此处不可逆,主要是check长度,直接跳过上面的check逆下面的算法就可以得到sn,所以直到此处所有的check几乎都是无用的,纯属误导。

以下是真正的check且可逆,首先程序将输入的字符串取前36个字节base64decode,得到decode后的字节,应为26bytes,(此处暴露了sn长度应该为36个字节),之后对这26个字节进行分割,分割为v1,v2,v3,c,分别为6、6、6、8个字节,对输入的36个字节的前二十四个进行分割,分割为key1,key2,key3,均为8字节,之后进行3DES解密,密钥为key1key2key3,密文为c,即des_decrypt(key3,c),des_encrypt(key2,c),des_crypt(key3,c),最终得到的c为8字节明文,这里视为v4,之后是md5校验(此处如上所说并没有用),最终的校验是4个迷宫check,将上述得到的v1,v2,v3,v4分别送入迷宫check,正确的话预设值+1,最终检验预设值是否为4,即四个迷宫都要走完,迷宫均为13*13矩阵,起点为‘@’,终点为‘#’,除第一个显示给出外,其余三个均为在第一个迷宫的基础上动态生成。

解题思路:

去混淆,整理出四个迷宫,依据迷宫规则推导出v1,v2,v3,v4,其中v1、v2、v3为6bytes,v4为8bytes,前三个迷宫有且只有一条长度为18的路径,第四个迷宫有且只有一条长度为24的路径,至于v1、v2、v3、v4的长度由程序可以直接得到,根据迷宫规则目测即可非常快速的得到路径,也可写脚本得到,之后对v1、v2、v3分别进行base64encode得到key1,key2,key3,对v4进行3des加密,密钥为key1,key2,key3,最后对得到的结果c进行base64encode得到一个12bytes的字符串,将key1,key2,key3和c拼接就可得到长度为36bytes的sn

四个迷宫分别为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
maze1:
*************
*@***********
*-***********
*--**----****
*-***-**-****
*-***#**-****
*--*****-****
**-*****-****
**-------****
**-*-----****
**---**-*****
**-****--****
*************

maze2:
*************
*@***********
*-***********
*-***-**-****
*--**----****
*-***#**-****
*--*****-****
**-*****-****
**-*-----****
**---**-*****
**-------****
**-****--****
*************

maze3:
*************
*@***********
*-***********
*-***-**-****
*--*****-****
*-***#**-****
*--**----****
**-*****-****
**-****--****
**---**-*****
**-*-----****
**-------****
*************

maze4:
*************
**-------****
*--*****-****
*-***-**-****
*--*****-****
*-***#**-****
*-***-**-****
*-***-**-****
*--**----****
**---**-*****
*--*****-****
*@***********
*************

很容易得到四个迷宫的最短路径为

1
2
3
4
5
6
7
ssss sdss dddd ddww wwwa aass

ssss sdss sddw dddd wwww aaas

ssss sdss sdds dddw wdww aaaw

wdww awww wwwd wddd ddds ssss ssaa awww

迷宫规则为 00 w 01 s 10 a 11 d

所以可以得到4个迷宫check的内容分别为

1
2
3
4
5
6
7
v1 = b'\x55\x75\xff\xf0\x02\xa5'

v2 = b'\x55\x75\x7c\xff\x00\xa9'

v3 = b'\x55\x75\x7d\xfc\x30\xa8'

v4 = b'\x30\x80\x03\x3f\xfd\x55\x5a\x80'

接下来就是DES3加密了,key为base64encode(v1+v2+v3),m为v4

sn = key + base64encode(v4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64
from Crypto.Cipher import DES3
from hashlib import md5

v1 = b'\x55\x75\xff\xf0\x02\xa5'
v2 = b'\x55\x75\x7c\xff\x00\xa9'
v3 = b'\x55\x75\x7d\xfc\x30\xa8'
v4 = b'\x30\x80\x03\x3f\xfd\x55\x5a\x80'
key = base64.b64encode(v1+v2+v3)
print('key:',key)
print('m:',v4)
c = DES3.new(key, DES3.MODE_ECB)
cipher = base64.b64encode(c.encrypt(v4))
sn = key + cipher
assert(md5(sn+b'Welcome/to/this/very/simple/challenge').hexdigest() == '44e4403b63620a2075d3fb2e0a6207d2')
print('sn:', sn.decode())

get sn:VXX/8AKlVXV8/wCpVXV9/DCogeWKJMtrmeY=

杂杂碎:

其实原本的打算是将前面的一些算法也运用在check里面,但是如此将变成算法的堆叠,感觉没多大意思,还有一点就是本来是打算魔改下DES3的,但是由于时间的问题所以也未果了(其实还是太菜了),大佬们都tql,写了几个小时的题目,半天就被秒了!

0%