小祥为了保护自己的代码,修改了部分Python Bytecode指令集,并把这个指令集称之为JPython, JPython只能在他私人定制的环境上才能运行,其他人无法得到这个环境。 现在,小明为了获取小祥代码中的秘密,收集到了三个文件 hash.pyc 可以直接使用Python 2.7运行的脚本 Jhash.pyc 通过hash.pyc转化而成的只能在JPython环境上运行的脚本 Jflag.pyc 藏着小祥最大的秘密,但是只能在JPython的环境运行。 谁能帮助小明得到小祥代码里的秘密呢?
给了三个附件
将hash.pyc与Jhash.pyc进行对比,得到修改后的opcode
f1 = open(r"hash.pyc", 'rb').read()
f2 = open(r"Jhash.pyc", 'rb').read()
t = {}
for i in range(len(f1)):
if f1[i] != f2[i]:
t[f2[i]] = f1[i]
print(t)
{148: 100, 117: 108, 69: 90, 149: 101, 39: 24, 35: 20, 38: 23}
然后用uncompyle6反汇编
加密过程:base64加密->异或7
写出对应的解密脚本
import base64
enc = "^P]mc@]0emZ7VOZ2_}A}VBwpbQ?5e5>lN4UwSSM>L}A}"
enc = ''.join(chr(ord(c) ^ 7) for c in enc)
print(enc)
print(base64.b64decode(enc))
YWZjdGZ7bj]0QH]5XzFzQEpweV82b29kI3RpTTJ9KzFz
base64应该没有[
可能多替换了一个
print(ord(']') ^ 7)
得到多替换的是90
,将得到字典,删去69: 90
f1 = open(r"hash.pyc", 'rb').read()
f2 = open(r"Jhash.pyc", 'rb').read()
t = {}
for i in range(len(f1)):
if f1[i] != f2[i]:
t[f2[i]] = f1[i]
print(t)
x = {148: 100, 117: 108, 149: 101, 39: 24, 35: 20, 38: 23}
print(x)
f3 = open(r"Jflag.pyc", 'rb').read().decode('ISO-8859-1')
t3 = f3.translate(x).encode('ISO-8859-1')
open(r"flag.pyc", 'wb').write(t3)
重新uncompyle6反汇编
得到正确的密文^P]mc@]0emE7VOE2_}A}VBwpbQ?5e5>lN4UwSSM>L}A}
重新写一个解密脚本
import base64
enc = "^P]mc@]0emE7VOE2_}A}VBwpbQ?5e5>lN4UwSSM>L}A}"
enc = ''.join(chr(ord(c) ^ 7) for c in enc)
print(enc)
print(base64.b64decode(enc))
YWZjdGZ7bjB0QHB5XzFzQEpweV82b29kI3RpTTJ9KzFz
b'afctf{n0t@py_1s@Jpy_6ood#tiM2}+1s'