-
-
[原创]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内核攻防全技术栈,打造具备自动化能力的内核开发高手。
赞赏
赞赏
雪币:
留言: