首页
社区
课程
招聘
[讨论][原创]巳时·绿光幽语 WP
发表于: 22小时前 236

[讨论][原创]巳时·绿光幽语 WP

22小时前
236

附件只有一个 64 位 Windows 可执行文件 题目.exe。程序表面上是一个几乎为空的 PyInstaller 单文件程序,真正逻辑并不在入口 main.py,而是隐藏在被篡改的 CPython 运行时中。需要穿过 PyInstaller 引导层,定位 python313.dll 内嵌的 frozen module,再恢复自修改 Python 字节码所用的 6 字节密钥。

可验证的 6 字符 key 为:

输入后程序输出:

附件内没有存放带包裹的 flag{...}/KCTF{...} 字符串;若赛题平台规定了统一格式,则按平台规则包裹 yb6tcr,例如 flag{yb6tcr}。

字符串中有 PyMarshal_ReadObjectFromString、_PYI_PARENT_PROCESS_LEVEL 和 MEI\x0c\x0b\x0a\x0b\x0e,可确认为 PyInstaller one-file 程序。

PyInstaller cookie 位于文件偏移 0x717f0b:

CArchive 共 21 项,只有一个用户入口 main。其压缩数据在 0x59f9e,121 字节,zlib 解压后为 159 字节的 Python 3.13 marshal code object。

恢复 Python 3.13 opcode 后,唯一入口等价于:

co_names 只有 ('sys', 'exit'),没有输入、比较或解密逻辑。PYZ.pyz 的 112 个项也全部是标准库。如果在这里就停止,会错误判定附件为空。

归档中的 .pyd 和 OpenSSL 文件与官方 Python 3.13.13 发行件逐字节一致,但 python313.dll 明显异常:

它不是 python.org 的原版 DLL,而是重新编译且修改过的 CPython。PDB 路径中的 789456 是误导,并不是正确 key。

CPython DLL 导出 _PyImport_FrozenStdlib。该导出处存放的指针指向 _frozen 表,x64 下每项可按以下结构解析:

题目 DLL 中的定位结果:

官方 3.13.1 的 frozen os 只有 45,748 字节。递归比对 frozen modules 后,真正的语义差异只在 os:顶层 co_code 由 2,858 增至 3,572 字节,并新增 my_function、b_key、__code__、replace 和 succ 等名称。

PyInstaller 的第一个引导模块 pyimod01_archive 在第 17 行执行 import os,因此植入逻辑在诱饵 main.py 之前就会触发。

frozen os 末尾的逻辑等价于:

外层最多循环 20 次,长度错误或字节码/解码异常都会重试。提示文本被分成 8 段,每字节异或 0x55 后才显示。

原始 my_function 的 co_code 可直接从 code object 中取出:

密文 c 与该已知明文异或,得到:

循环节长是 6,所以 key 为 yb6tcr。仅看前 6 字节也可验证:

再用此 key 解密 succ,得到 UTF-8 文本 恭喜成功!。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

最后于 12小时前 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 1
打赏
分享
最新回复 (1)
雪    币: 158
活跃值: (5361)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666
11小时前
0
游客
登录 | 注册 方可回帖
返回