首页
社区
课程
招聘
[原创]kctf2026 第二题 巳时·绿光幽语
发表于: 2天前 30

[原创]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",)
  • 8 条 16 字节的加密字符串(提示文本)
  • 关键常量:"utf-8"、整数 6、一段 26 字节加密字符串、一段 15 字节加密字符串,以及 "co_code""co_consts" 等用于 __code__.replace() 的名字
  • 外围模块代码的名字表中有 inputb_keybufferreplacecpu_countsuccException 等,即挑战逻辑:读入 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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回