首页
社区
课程
招聘
[原创]KCTF 第二题 Writeup
发表于: 2天前 51

[原创]KCTF 第二题 Writeup

2天前
51

结论

正确的 key 是:yb6tcr

分析过程

1. 识别打包方式

题目.exe 是 PyInstaller 打包的 Python 程序。用 pyinstxtractor-ng 解包后发现 main.pyc 只是个 sys.exit(0) 空壳,PYZ.pyz 里也只有标准库,表面上没有业务代码。

2. 定位真实代码

真正代码藏在 python313.dll 中:标准模块 <frozen os> 被改写过,其 marshal 数据位于 .rdata,偏移 0x4D00E0。程序启动时 os 必然被导入,附加在模块尾部的挑战代码因此会执行。

反序列化该模块后,末尾可见附加逻辑:

  • 定义假的 my_function,初始只打印 666
  • byte ^ 85 解出一段文字并打印,即运行时提示 请输入key还原代码(请输入6个字符)
  • 等待输入 6 字符 key,然后按 enc[i] ^ key[i % 6] 解密两段数据:
    • my_function.__code__.co_code(26 字节)
    • co_consts 中的常量(15 字节)
  • 还原后把 my_function.__code__ 替换掉并调用它

3. 反推 key

co_consts 还原目标显然是 "恭喜成功!",其 UTF-8 为:

e6 81 ad e5 96 9c e6 88 90 e5 8a 9f ef bc 81

对应的密文是:

9f e3 9b 91 f5 ee 9f ea a6 91 e9 ed 96 de b7

逐字节异或恢复 key:

9f^e6=79 'y'   e3^81=62 'b'   9b^ad=36 '6'
91^e5=74 't'   f5^96=63 'c'   ee^9c=72 'r'

后 9 字节用同一 key 循环验证结果一致,得到 6 位 key:yb6tcr

4. 验证

yb6tcr 解密 26 字节的 co_code,得到指令:

RESUME 0
LOAD_GLOBAL print
LOAD_CONST 1
CALL 1
POP_TOP
RETURN_CONST 0

配合常量 "恭喜成功!",执行后输出 恭喜成功!,校验通过。

一句话总结

PyInstaller 解包后真正的逻辑在 python313.dll<frozen os> 模块里,key 用于异或还原 my_function 的字节码和常量;用已知明文 "恭喜成功!" 与密文逐字节异或即可直接得到序列号 yb6tcr


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

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