感想(废话)
首先我的代码写得很辣鸡,因为这方面而给各位逆向带来不便之处请谅解。给出源码,编译参数:gcc src.c src2.c des.c -masm=intel -std=c99 -s -o easyre,源代码放在协会的github上,源码
出题人一开始脑子进水了,忘记输入顺序不同形成的二叉排序树可能是一样的。所以在第一次加密验证了前18位flag,第二次加密验证了后18位flag。
逻辑大致为输入36位flag,生成二叉排序树,然后先序遍历,DES加密过后,与一个矩阵作运算,然后验证。
第二次是后序遍历,按位取反操作。因为简单,所以加了smc。
实现了一些简单的反调试,为了不让解题者patch这段代码,于是把反调试的机器码用于smc的解密数据,并放在反调试代码里面,事实上有些队伍确实没看到这段代码,直接爆破去解密代码。事实上把检测进程的名字patch掉(很多队伍这么做)绕过反调。IDApython直接解密加密代码,纯静态逆向就行了。有队伍没看出DES加密,直接逆,真是orz了。不得不佩服,不过出题人都说了没有坑嘛,我这么诚实。
脚本(写得很辣鸡)
解矩阵
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
des = []
mat2 = [[23,65,24,78,43,56],
[59,67,21,43,45,76],
[23,54,76,12,65,43],
[89,40,32,67,73,57],
[23,45,31,54,31,52],
[13,24,54,65,34,24]
]
enc = [[43666,49158,43029,51488,53397,51921],
[28676,39740,26785,41665,35675,40629],
[32311,31394,20373,41796,33452,35840],
[17195,29175,29485,28278,28833,28468],
[46181,58369,44855,56018,57225,60666],
[25981,26680,24526,38780,29172,30110]]
des_str = ""
C=dot(enc,linalg.inv(mat2))
#print C
for i in range(0,6):
for j in range(0,6):
des.append(int(round(C[i][j])))
#print des
for i in range(len(des)):
if len(hex(des[i])[2:]) == 2:
des_str += hex(des[i])[2:]
else:
des_str += '0'+ hex(des[i])[2:]
print des_str + hex(0x73)[2:] + hex(0x3C)[2:] + hex(0xF5)[2:] + hex(0x7C)[2:] 直接找网站在线解密得```LC-+)=1234@AFETRS{the^VYXZfislrvxyz}``` 对应一下为```LCTF{this-RevlrSE=``` 第二个加密
x = [ 124, 129, 97, 153, 103, 155, 20, 234, 104, 135,
16, 236, 22, 249, 7, 242, 15, 243, 3, 244,
51, 207, 39, 198, 38, 195, 61, 208, 44, 210,
35, 222, 40, 209, 1, 230]
for i in xrange(36):
for j in xrange(0, 8, 2):
x[i] ^= (1 << (j + i % 2))
解得)+4321A@=-EFCSRXZYV^ferlsihzyxvt}{TL
对应一下为^V1@Y+)fAxyzXZ234}
所以LCTF{this-RevlrSE=^V1@Y+)fAxyzXZ234}