LCTF2018-拿去签到吧朋友 office writeup by fa1con

LCTF2018-拿去签到吧朋友 office writeup by fa1con

Posted by fa1con on November 19, 2018

感想(废话)

首先我的代码写得很辣鸡,因为这方面而给各位逆向带来不便之处请谅解。给出源码,编译参数: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}