攻防世界-crypto-easychallenge(.pyc反编译)
进入题目后下载附件,发现是一个.pyc文件。
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,运行加载的速度会有所提高;另一反面,把py文件编译为pyc文件,从而可以实现部分的源码隐藏,保证了python做商业化软件时的安全性
用uncompyle6这个第三方python反编译器来进行反编译。
uncompyle6是一个原生python的跨版本反编译器和fragment反编译器,是decompyle、uncompyle、uncompyle2等的接替者。
uncompyle6可将python字节码转换回等效的python源代码,它接受python 1.3版到3.8版的字节码,这其中跨越了24年的python版本,此外还包括Dropbox的Python 2.5字节码和一些PyPy字节码。
github项目:https://github.com/rocky/python-uncompyle6
pip install uncompyle6
uncompyle6 -o . test.pyc
得到py代码如下:
import base64 def encode1(ans): s = '' for i in ans: x = ord(i) ^ 36 x = x + 25 s += chr(x) return s def encode2(ans): s = '' for i in ans: x = ord(i) + 36 x = x ^ 36 s += chr(x) return s def encode3(ans): return base64.b32encode(ans) flag = ' ' print 'Please Input your flag:' flag = raw_input() final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' if encode3(encode2(encode1(flag))) == final: print 'correct' else: print 'wrong'
代码解析
encode1函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再与36异或,然后+25,接着转回字符,最后拼接为新的字符串输出。
因此对应的decode1函数应该是先-25,再与36异或(异或的逆操作还是异或)。
encode2函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再+36,然后与36异或,接着转回字符,最后拼接为新的字符串输出。
因此对应的decode2函数应该是先与36异或,再-36。
encode3函数是调用base64库里的b32encode()函数进行base32运算。
因此对应的decode3函数应该是base64.b32decode()。
下面是对应的解密代码
import base64 def decode1(ans): s = '' for i in ans: x = ord(i) - 25 x = x ^ 36 s += chr(x) return s def decode2(ans): s = '' for i in ans: x = i^ 36 x = x - 36 s += chr(x) return s def decode3(ans): return base64.b32decode(ans) final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' flag=decode1(decode2(decode3(final))) print(flag)
得到对应的flag为cyberpeace{interestinghhhhh}
参考:https://www.jianshu.com/p/aafdedcbab4f