首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
0
0
[原创]Writeup:第二题:巳时·绿光幽语
发表于: 2026-8-11 14:17
99
[原创]Writeup:第二题:巳时·绿光幽语
mb_jctujatw
2026-8-11 14:17
99
# Writeup:题目.exe(PyInstaller / frozen os 字节码还原) ## 题目信息 - 类型:Reverse - 文件:`题目.exe` - 环境提示:PyInstaller 打包,Python 3.13;可用 `pyinstxtractor-ng` 解包 题面大意:文件分段加密、硬件密钥碎片等叙事,实际考点是 **运行时还原被 XOR 加密的函数字节码**。 ## 0x01 解包与初步观察 ```bash pyinstxtractor-ng.exe .\题目.exe ``` 解包后可见: - 入口 `main.pyc` 极小,反编译后仅为: ```python import sys sys.exit(0) ``` - `PYZ` 内几乎全是标准库,没有独立的业务模块 - 运行程序却出现交互提示(需输入 6 字符 key) 说明:**真正逻辑不在 `main.pyc`**。 ## 0x02 定位真实逻辑 运行后在 `%TEMP%\_MEI*` 中检查提取文件,发现提示字符串与 `my_function` 出现在: ```text python313.dll ``` 进一步用 Python 3.13 从 DLL 中 `marshal.loads` 提取 frozen 模块,确认挑战代码被注入到: ```text <frozen os> ``` 即:PyInstaller 引导阶段 `import os` 时,会执行写在 frozen `os` 模块末尾的挑战逻辑;`main` 随后直接退出。 ## 0x03 逻辑还原 挑战流程大致如下: 1. 将多段密文字节与常量 `85` 逐字节 XOR,拼出提示文本并打印 2. `input()` 读取 key,长度必须为 **6** 3. 用 key 循环 XOR 解密两段数据: - `c` → 作为 `my_function.__code__.co_code` - `succ` → UTF-8 解码后,作为 `co_consts = (None, succ_str)` 4. 把还原后的 code object 写回 `my_function.__code__`,并调用 `my_function()` 相关常量(摘录): ```python enc_code = b'\xecbmucryb6tcr*c\x03ucryb6tCr\x1eb' # 26 bytes enc_consts = b'\x9f\xe3\x9b\x91\xf5\xee\x9f\xea\xa6\x91\xe9\xed\x96\xde\xb7' # 15 bytes ``` 提示模板显示目标函数形如: ```python def my_function(): print("恭喜成功!") ``` ## 0x04 已知明文攻击 在 Python 3.13 中: - `print(666)` 与 `print("恭喜成功!")` 的 **`co_code` 相同**(都是 `LOAD_CONST 1` 再 `CALL`) - 差异只在 `co_consts` 因此: 1. 明文 `co_code` 可直接取当前 stub / 本地编译结果(26 字节) 2. 明文 `co_consts` 第二项应为 UTF-8:`恭喜成功!`(恰好 15 字节) 对密文做 XOR: ```python known_code = bytes.fromhex('95005b0100000000000000005301350100000000000020006700') known_consts = '恭喜成功!'.encode('utf-8') ks_code = bytes(a ^ b for a, b in zip(enc_code, known_code)) ks_consts = bytes(a ^ b for a, b in zip(enc_consts, known_consts)) ``` 得到循环密钥流: ```text yb6tcryb6tcryb6t... ``` 即 6 字节 key: ```text yb6tcr ``` 验证:用该 key 解密 `enc_code` / `enc_consts` 可分别还原合法字节码与 `恭喜成功!`。 ## 0x05 验证 ```text 输入: yb6tcr 输出: 恭喜成功! ``` ## Flag / Key ```text yb6tcr ``` (若平台要求 `flag{...}` 包装,按赛方格式提交即可。) ## 小结 | 步骤 | 做法 | |------|------| | 解包 | PyInstaller → 发现 `main` 为空壳 | | 定位 | 运行时字符串落在 `python313.dll` / frozen `os` | | 分析 | key 循环 XOR 还原 `co_code` + `co_consts` | | 求解 | 已知明文 XOR 直接得到 `yb6tcr` | 关键技巧:**PyInstaller + 魔改 frozen stdlib**;业务逻辑可藏在 `python3xx.dll` 的 marshal 代码对象中,而不是入口 `main.pyc`。
登录后可查看完整内容
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
mb_jctujatw
3
发帖
0
回帖
10
RANK
关注
私信
他的文章
[原创]Writeup:第二题:巳时·绿光幽语
99
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部