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 //这里的两次对128求模是多余的,一次对128求模即可。
替代为num = ((input1[i] + i) % 128
code += num //从下方的代码看出来code是数组,那么这里的+=说明code和num都
是数组,所以可以把它看成code[i]+=num[i]
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']
这里的是原题的代码。
第一个for循环是对数组code的每一个元素进行加密。
第二个for循环是对新得到的数组code中的元素对其下一位进行异或。
需要注意,只有最后一位是没有异或时改变的。
那么把代码逆向写出来也是需要分成两步。
这里是wp的代码
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!}
异或的基本知识,同0异1。
a=1001,b=0100。a对b异或,得到c=1101。
不知道a时,b对c异或,得到a=1001。
所以想对异或进行还原,就要从没有改变的最后一位往前进行异或。
code.reverse() //先把code数组倒序一下,再正常用for循环
l = len(code)
for i in range(l-1): //注意这里l-1是开区间,只能取到[0,l-1)
code[i + 1] = code[i] ^ code[i + 1] //举例最后一位,如果10个元素,l=10,code[9]=code[8]^code[9]
第一步完成
第二步:求出flag明文input[i]。
原代码中num = ((input1[i] + i) % 128
所以想求出input1[i]有两种情况
(1)input1[i]+i<128,此时num[i]=num[i]-i=input1[i]
(2)input1[i]+1>128,此时num[i]=num[i]+128-i=input1[i]
又有code[i]=num[i],代码如下了
code.reverse() //再把code数组正过来
for i in range(len(code)):
if code[i] - i < 0:
code[i] = code[i] + 128 -i
else:
code[i] =code[i]-i
再一次用code.reverse()还原回来,是因为原代码第一个for循环中,在算用于加密num时是用到了i的,所以要返回code原来的顺序。
注意,这里得到的code[i]都是数字(wp代码中把字符都转化成十六进制数了),所以需要chr(i)打印出来
flag = ''.join(chr(i) for i in code)
print(flag)