CTF笔记
[学习笔记]攻防世界—bad_python
2025-10-23
•2 分钟•312 字因为IDA不能识别被Python解释器翻译的pyc文件,我们要使用uncompyle6反编译工具 工具安装:
pip install uncompyle6
在控制台使用命令:
uncompyle6 --o 文件路径
来进行反编译(–o输出成文件),提示
到网上查查原因: https://blog.csdn.net/qq_28993251/article/details/137158130
据描述,是文件头缺失,我们简单的创建一个HelloWorld,然后引入py_compile库来将文件编译为.pyc文件,因为文件写着是python3.6,所以应该在3.6环境写代码 HelloWorld.py文件代码
import py_compile
print("HelloWorld")
py_compile.compile(r'当前脚本路径',r'输出.pyc文件路径')
#使用py_compile保存为.pyc文件
我使用的是010Editor打开这个文件
前十六位是我们需要的文件头,替换过来(010Editor可以使用[Ctrl+Shift+C][Ctrl+Shift+V]复制粘贴左边的十六进制代码)
现在再次尝试反编译
反编译成功了,我们直接打开文件,查看代码
from ctypes import *
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import long_to_bytes
def encrypt(v, k):
v0 = c_uint32(v[0])
v1 = c_uint32(v[1])
sum1 = c_uint32(0)
delta = 195935983
for i in range(32):
v0.value += (v1.value << 4 ^ v1.value >> 7) + v1.value ^ sum1.value + k[sum1.value & 3]
sum1.value += delta
v1.value += (v0.value << 4 ^ v0.value >> 7) + v0.value ^ sum1.value + k[sum1.value >> 9 & 3]
return (
v0.value, v1.value)
if __name__ == "__main__":
flag = input("please input your flag:")
k = [255, 187, 51, 68]
if len(flag) != 32:
print("wrong!")
exit(-1)
a = []
for i in range(0, 32, 8):
v1 = bytes_to_long(bytes(flag[i:i + 4], "ascii"))
v2 = bytes_to_long(bytes(flag[i + 4:i + 8], "ascii"))
a += encrypt([v1, v2], k)
enc = [
4006073346, 2582197823, 2235293281, 558171287, 2425328816,
1715140098, 986348143, 1948615354]
for i in range(8):
if enc[i] != a[i]:
print("wrong!")
exit(-1)
print("flag is flag{%s}" % flag)
现在我们一步步分析,写出解密代码 加密的flag是enc,密钥是k 最终一步步逆向代码,终于得到解密内容了 以下是脚本代码
from ctypes import *
from Crypto.Util.number import long_to_bytes
def decrypt(v, k):
v0 = c_uint32(v[0])
v1 = c_uint32(v[1])
delta = 195935983
sum1 = c_uint32(delta * 32)
for i in range(32):
v1.value -= (v0.value << 4 ^ v0.value >> 7) + v0.value ^ sum1.value + k[sum1.value >> 9 & 3]
sum1.value -= delta
v0.value -= (v1.value << 4 ^ v1.value >> 7) + v1.value ^ sum1.value + k[sum1.value & 3]
return (
v0.value, v1.value)
enc = [
4006073346, 2582197823, 2235293281, 558171287, 2425328816,
1715140098, 986348143, 1948615354]
k = [255, 187, 51, 68]
flag = [0] * 32
for i in range(0, 32, 8):
res = decrypt([enc[i // 4], enc[i // 4 + 1]], k)
flag[i:i + 4] = long_to_bytes(res[0], 4)
flag[i + 4:i + 8] = long_to_bytes(res[1], 4)
for i in range(0, 32):
print("%c" % flag[i],end='')
运行脚本,得到flag
套上flag{},提交成功