-
-
第二题:巳时·绿光幽语
-
发表于: 2026-8-11 13:12 22
-
一、题目信息
目标文件为“题目.exe”。程序运行后显示一段待还原的 Python 代码,并要求输入 6 个字符的 key。
二、初步识别
首先使用 IDA 打开题目.exe。该文件是一个 Windows x64 的 PyInstaller 程序。
主要特征如下:
PE32+,x64,控制台程序。
文件尾部存在 MEI cookie 和 PyInstaller CArchive。
导入表中包含 Python 初始化相关函数。
可以看到 PyMarshal_ReadObjectFromString、PyRun_SimpleStringFlags 等字符串。
使用 PyInstaller archive viewer 查看文件内容,可以看到:
main
base_library.zip
python313.dll
PYZ.pyz
其中 PYZ.pyz 主要是 Python 标准库,main 解压后只有 159 字节,并没有明显的题目逻辑。因此题目代码不在普通 Python 主模块中。
从 CArchive 中提取 python313.dll,然后在 DLL 中搜索以下字符串:
my_function
co_code
co_consts
b_key
input
这些字符串集中出现在文件偏移 0x4DACE9 附近。
通过 Python DLL 的 frozen module 表,定位到被修改的 frozen os 模块:
模块名:os
代码偏移:0x4D00E0
代码大小:47420 字节
因此,题目作者将校验代码插入了 CPython 内置的 frozen os 模块中。程序启动并导入 os 时,隐藏代码会自动执行。
使用 xdis 解析 Python 3.13 的 marshal 数据后,新增代码逻辑可以还原为:
原始的 my_function 内容是:
对应的 Python 3.13 字节码为:
95 00 5b 01 00 00 00 00 00 00 00 00
53 01 35 01 00 00 00 00 00 00 20 00
67 00
也就是 26 字节:
95005b0100000000000000005301350100000000000020006700
密文 c 与原始 co_code 的长度都是 26 字节。程序使用 6 字节 key 循环 XOR,因此可以直接计算:
赞赏
- 第二题:巳时·绿光幽语 22