-
-
[原创]kctf2026 第二题 巳时·绿光幽语
-
发表于: 2天前 30
-
kctf2026 第二题 巳时·绿光幽语
题目概述
题目.exe 是一个 PyInstaller 打包的 Python 程序。运行后提示:
提示,需要还原的代码
def my_function():
print("恭喜成功!")
请输入key还原代码(请输入6个字符)
要求输入 6 个字符的 key 还原被加密的代码,还原成功则打印结果。核心逻辑被修改在程序自带的 python313.dll 中。
解题思路
1. 定位加密数据
对修改版 python313.dll 用 IDA 分析(可与标准版 标准python313.dll 对比),在地址 0x1804DC690 处发现一段内嵌的 Python marshal 数据(无直接 xref,被间接访问),内容是一个修改过的冻结模块数据,其中包含:
- 一个
my_function的 code object:- co_code(26 字节,合法 3.13 字节码):
RESUME 0; LOAD_GLOBAL print; LOAD_CONST 1; CALL 1; POP_TOP; RETURN_CONST None - co_consts =
(None, 666),co_names =("print",)
- co_code(26 字节,合法 3.13 字节码):
- 8 条 16 字节的加密字符串(提示文本)
- 关键常量:
"utf-8"、整数6、一段 26 字节加密字符串、一段 15 字节加密字符串,以及"co_code"、"co_consts"等用于__code__.replace()的名字 - 外围模块代码的名字表中有
input、b_key、buffer、replace、cpu_count、succ、Exception等,即挑战逻辑:读入 key → XOR 解密 → 替换my_function.__code__→ 调用
(该 marshal 流的 ref 表是预置的,会出现 r 25 01 这类大序号引用,不能直接 marshal.loads,需自己写解析器逐字段读。)
2. 分析加密方式
加密为 6 字节密钥循环 XOR。
8 条提示文本用单字节 0x55(即 UUUUUU)即可解出,内容为题目界面上显示的那段提示("提示,需要还原的代码\r\ndef my_function():...")。
真正被用户 key 加密的是那段 26 字节字符串,它正是用来替换 my_function.co_code 的加密字节码。
3. 已知明文攻击推出 key
26 字节恰好对应目标代码 print("恭喜成功!") 的完整 3.13 字节码:
95 00 RESUME 0
5b 01 LOAD_GLOBAL 1 (print,含 NULL 位)
00*8 4 个缓存单元
53 01 LOAD_CONST 1
35 01 CALL 1
00*6 3 个缓存单元
20 00 POP_TOP
67 00 RETURN_CONST None
密文前 6 字节为 ec 62 6d 75 63 72,与明文 95 00 5b 01 00 00 逐字节异或得:
ec^95=79 'y' 62^00=62 'b' 6d^5b=36 '6'
75^01=74 't' 63^00=63 'c' 72^00=72 'r'
即 key = yb6tcr。
验证一:26 字节密文用 yb6tcr 循环异或,得到完整合法字节码(缓存位全部归 0,CALL/POP_TOP/RETURN_CONST 位置全部吻合)。
验证二:另一段 15 字节加密字符串用同一 key 解出 UTF-8 字符串 恭喜成功!(即替换后的 co_consts 内容),交叉确认 key 正确。
4. 运行验证

程序正常退出(exit=0),还原成功。
Flag
yb6tcr
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。