[AFCTF 2018]JPython

43 篇文章 1 订阅
20 篇文章 0 订阅

小祥为了保护自己的代码,修改了部分Python Bytecode指令集,并把这个指令集称之为JPython, JPython只能在他私人定制的环境上才能运行,其他人无法得到这个环境。 现在,小明为了获取小祥代码中的秘密,收集到了三个文件 hash.pyc 可以直接使用Python 2.7运行的脚本 Jhash.pyc 通过hash.pyc转化而成的只能在JPython环境上运行的脚本 Jflag.pyc 藏着小祥最大的秘密,但是只能在JPython的环境运行。 谁能帮助小明得到小祥代码里的秘密呢?

给了三个附件
image.png
将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反汇编
image.png
加密过程: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反汇编
image.png
得到正确的密文^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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值