-
-
[原创]看雪·2026 KCTF 第二题:巳时·绿光幽语 Writeup
-
发表于: 2026-8-11 13:15 24
-
题目信息:
文件:题目.exe
类型:PyInstaller 打包的 Python 程序
要求:输入6个字符的key,还原被加密的代码
解题过程:
一、提取 PyInstaller 打包文件
使用 pyinstxtractor-ng 提取题目.exe,得到以下关键文件:
- main.pyc:入口脚本(仅 import sys; sys.exit(0),是空壳)
- PYZ.pyz:Python 模块压缩包(含所有标准库)
- python313.dll:Python 运行时 DLL
- 各种 .pyd 和 .dll 文件
二、分析 main.pyc
使用 xdis 反汇编 main.pyc,发现它只是 import sys 然后 exit(0),没有任何业务逻辑。
真正的代码被隐藏在别处。
三、运行程序观察行为
运行题目.exe,程序循环输出:
提示,需要还原的代码
def my_function():
print("恭喜成功!")
请输入key还原代码(请输入6个字符)
说明程序需要输入6个字符的key来解密代码。
四、搜索关键字符串
在 python313.dll 中搜索 "my_function" 字符串,在偏移 0x4DACE9 处找到。
这说明出题人修改了 python313.dll,将加密数据嵌入其中。
五、分析加密数据
在 my_function 附近找到8段16字节的加密字符串(TYPE_STRING格式):
b3dac5b2f1efbae9d9bcc9d5bdf3d4bd
eacdb0dbcab2cfd1b1eef6b2f5d4585f
31303375382c0a33203b36213c3a3b7d
7c6f585f5c25273c3b217d77b3d4f8b0
c3c9b3ddc5b0dfcabae9d4777c585fbd
fae2bdebc6b0d0f03e302cbdeacdb0db
cab1eef6b2f5d4bae9ddbdfae2bdebc6
b0d0f063b1edffb0f8c2b2f9f3bae9dc
拼接后共128字节。尝试单字节XOR密钥0x55,解密得到:
提示,需要还原的代码
def my_function():
print("恭喜成功!")
请输入key还原代码(请输入6个字符)
确认加密方式为 XOR 0x55。
六、找到加密字节码
在8段字符串之后,找到一段26字节的加密数据:
ec626d7563727962367463722a63037563727962367443721e62
这是 my_function 的 co_code(字节码),被XOR 0x55加密。
七、还原密钥
已知目标函数是:
def my_function():
print("恭喜成功!")
对应的 Python 3.13 字节码前6字节为:95 00 5b 01 00 00
将加密字节码前6字节与目标字节码前6字节逐字节XOR:
ec ^ 95 = 79 = 'y'
62 ^ 00 = 62 = 'b'
6d ^ 5b = 36 = '6'
75 ^ 01 = 74 = 't'
63 ^ 00 = 63 = 'c'
72 ^ 00 = 72 = 'r'
得到6字节密钥:yb6tcr
八、验证
运行题目.exe,输入 yb6tcr,程序输出"恭喜成功!",验证通过。
答案:
Key = yb6tcr
技术要点总结:
1. PyInstaller 打包的 EXE 可通过 pyinstxtractor 提取
2. 出题人修改了 python313.dll,将加密数据嵌入 DLL 中
3. 字符串使用单字节 XOR 0x55 加密
4. 字节码使用 XOR 加密,密钥为6个字符
5. 通过已知明文(目标函数的字节码)反推密钥
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。