首页
社区
课程
招聘
[分享]KCTF 2026 Reverse:巳时·绿光幽语
发表于: 2天前 64

[分享]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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 1天前 被kanxue编辑 ,原因:
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回