-
-
[分享]KCTF 2026 Reverse:巳时·绿光幽语
-
发表于: 2天前 64
-
样本信息:
EXE 大小约 7.4 MB,字符串中存在大量 PyInstaller 特征:
因此可以判断它是使用 Python 3.13 打包的 PyInstaller 单文件程序。
文件末尾是 88 字节的 PyInstaller Cookie,结构为:
解析结果:
TOC 中的主要项目包括:
解压入口 main 后得到 159 字节 marshal 数据。使用相同版本的 Python 3.13.1 反序列化并反汇编,入口逻辑只有:
这说明外层 main.py 只是烟雾弹,常规 PyInstaller 解包无法直接得到题目逻辑。
继续检查程序内嵌的 python313.dll,发现它与官方 DLL 明显不同:
题目 DLL 的版本字符串为:
官方版本为:
对两个 DLL 的字符串集合做差分,可在题目版本中发现异常字符串:
这些字符串位于 CPython 冻结 os 模块的数据附近。由此推断,出题人修改并重新编译了 CPython,把真正逻辑塞进了内置冻结模块。
可以使用 CPython 内部接口取得冻结代码对象,同时避免直接执行模块:
启动解释器时增加 -S,禁用 site 初始化,避免系统提前导入并执行修改后的 os:
反汇编 os 模块末尾,可以看到从约 1185 行开始多出一段恢复器。模块先定义一个假的函数:
随后进入最多 20 次的恢复循环。整理后的伪代码如下:
关键点是程序会动态替换:
所以普通反编译只能看到 print(666),真正字节码必须使用正确 key 解密后才会出现。
恢复器中存在 8 个长度为 16 的 bytes 分片。将它们拼接后与 0x55 异或:
解密结果为:
由此得知,动态恢复后的字符串常量应当是:
程序中的加密成功字符串为:
已知目标字符串 恭喜成功! 的 UTF-8 字节为:
密文与明文逐字节异或:
结果以 6 字节为周期:
所以 key 为:
加密字节码为:
与 yb6tcr 循环异或后得到:
这是合法的 Python 3.13 字节码,等价于:
向题目程序输入 yb6tcr,定制解释器实际输出:
因此最终答案为:
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。