这道题算是比较简单的逆算法了,初入逆向,想借这个题来理理自己的思路
拿到附件,发现是一个.pyc文件,这里简单介绍一下
详细介绍可以参考大佬博客:什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件_点亮~黑夜的博客-CSDN博客_pyc文件
pyc文件:由Python文件经过编译后所生成的文件,是一种字节码,所以我们直接查看就会是一种乱码的状态,对源码会起到一定的保护作用,但是这种字节码是能够进行反编译的。
所以这里直接搜索在线反编译网站:python反编译 - 在线工具 得到:
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']
接下来就要反向计算一下了,这里就想记录一下自己做题的思路
这里提两个点:
1.
- x = 212 转化为二进制为 :11010100
- y = 155 转化为二进制为:10011011
- z 等于 x 和 y 异或的结果:x ^ y = 01001111 可知:
- z=x^y
- x=z^y
- y=z^x
2.模算法的逆运算
如果:A=(B-C)%D
那么: B=(A+C)%D
推导过程:假设A、B、C都为正整数
那么由A=(B-C)%D可知B-C=D*n+A,即B=A+C+D*n,当B<D时,两边对D取模,则
B%D=(A+C+D*n)%D=(A+C)%D
3. num其实想当于一个字符,就是用来存放flag变换的每一位,可以理解为就是一个工具人
code是密文,而我们要做的就是将code逆成flag
4.这里((input1[i] + i) % 128 + 128) % 128这么长一串其实就相当于(input1[i]+i)%128,可以自己用数学思维去推一下
理解了这几个点的话就好搞了,附上脚本
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
flag=""
for i in range(len(code)-2,-1,-1):
code[i]=chr(ord(code[i])^ord(code[i+1]))
for i in range(len(code)):
num=chr((ord(code[i])-i)%128)
flag+=num
print(flag)
flag为