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{},提交成功

许可协议: CC BY-SA 4.0 。转载请注明出处,允许商用;改编/转载须以相同许可(CC BY-SA 4.0)发布。如有问题请联系我。