pyc文件,直接在线反编译得到
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
简单的算法逆向
看到后面的异或是对code的第i位和第i+1位进行异或,可以得到,最后一位是没有异或过的,通过最后一位再异或回去就可以了
code = [0x1f,0x12,0x1d, 0x28,0x30,0x34, 0x01,0x06,0x14, 0x34,
0x2c, 0x1b, 0x55,0x3f,0x6f,0x36,0x2a,0x3a, 0x01, 0x44,
0x3b,0x25, 0x13]
print(code)
code.reverse()
l = len(code)
for i in range(l-1):
code[i + 1] = code[i] ^ code[i + 1]
第二步:
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
这里源码中取了两次余,实际上第二次是多余,所以只看第一次
这里可以发现,标准ASCII的最大值是127,如果这个数放在后面是有可能超过128的,所以需要做一个判断就是
if code[i] - i < 0
,如果小于0说明取余前的数肯定是大于128,所以这里需要再加128就可以了,code[i] = code[i] - i + 128
这里举个例子理解一下,
假设未加密的code[20] = 115
那么进行加密过程就是:
115 + 20 = 135 % 128 = 7
解密的时候就会发现
7 - 20 = 13
这里13刚好就是115到128的距离
所以可以得出明文为
-13 + 128 = 115
最后放上exp.py
print('Welcome to Re World!')
print('Your input1 is your flag~')
code = [0x1f,0x12,0x1d, 0x28,0x30,0x34, 0x01,0x06,0x14, 0x34,
0x2c, 0x1b, 0x55,0x3f,0x6f,0x36,0x2a,0x3a, 0x01, 0x44,
0x3b,0x25, 0x13]
code.reverse()
l = len(code)
for i in range(l-1):
code[i + 1] = code[i] ^ code[i + 1]
code.reverse()
for i in range(len(code)):
if code[i] - i < 0:
code[i] = code[i] + 128 -i
else:
code[i] -= i
flag = ''.join(chr(i) for i in code)
print(flag)
# GWHT{Just_Re_1s_Ha66y!}