首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
0
0
[原创]第二题:巳时·绿光幽语 wp
发表于: 2026-8-11 12:59
21
[原创]第二题:巳时·绿光幽语 wp
F1ux_Team
1
2026-8-11 12:59
21
# 题目 WP ## 题目分析 程序是 PyInstaller 打包的 Python 3.13 程序,先用 `pyinstxtractor.py` 解包: ```bash python pyinstxtractor.py 题目.exe ``` 解包后看到: ```text main.pyc python313.dll PYZ.pyz base_library.zip ``` 但是 `main.pyc` 很小,反汇编后只有: ```python import sys sys.exit(0) ``` 说明 `main.pyc` 是干扰项,真正逻辑不在解包出来的入口文件中,而是在运行时动态加载或修改的代码里。 ## 定位真实代码 运行程序后提示: ```text 提示,需要还原的代码 def my_function(): print("恭喜成功!") 请输入key还原代码(请输入6个字符) ``` 程序运行时会调用 Python 的 marshal 加载代码对象,因此可以用 Frida hook: ```text PyMarshal_ReadObjectFromString ``` 将传入的 marshal 字节码 dump 出来,再用 `xdis` 反汇编 Python 3.13 字节码。 在 dump 出来的运行时代码对象中发现关键变量: ```text my_function input b_key replace succ ``` 说明程序会读取 6 字符 key,然后动态替换 `my_function.__code__`。 ## 核心逻辑 反汇编后还原出关键逻辑: ```python def my_function(): print(666) key = input() if len(key) != 6: retry b_key = key.encode() c = b'\xecbmucryb6tcr*c\x03ucryb6tCr\x1eb' buf = b'' for i in range(len(c)): buf += (c[i] ^ b_key[i % len(b_key)]).to_bytes(1) my = my_function.__code__ my = my.replace(co_code=buf) succ = b'\x9f\xe3\x9b\x91\xf5\xee\x9f\xea\xa6\x91\xe9\xed\x96\xde\xb7' buf = b'' for i in range(len(succ)): buf += (succ[i] ^ b_key[i % len(b_key)]).to_bytes(1) my = my.replace(co_consts=(None, buf.decode("utf-8"))) my_function.__code__ = my my_function() ``` 也就是说,输入的 key 会作为循环异或密钥,用来解密: ```text 1. my_function 的 co_code 2. 成功字符串 ``` ## 求解 key 原始 `my_function` 是: ```python def my_function(): print(666) ``` 它的原始 `co_code` 为: ```text 95005b0100000000000000005301350100000000000020006700 ``` 密文 `c` 为: ```python c = b'\xecbmucryb6tcr*c\x03ucryb6tCr\x1eb' ``` 因此可以直接异或得到 key 流: ```python c = b'\xecbmucryb6tcr*c\x03ucryb6tCr\x1eb' orig = bytes.fromhex( "95005b0100000000000000005301350100000000000020006700" ) ks = bytes(c[i] ^ orig[i] for i in range(len(c))) print(ks) ``` 输出: ```text b'yb6tcryb6tcryb6tcryb6tcryb' ``` 可以看到 key 流以 6 字节为周期重复: ```text yb6tcr ``` ## 验证 用 `yb6tcr` 解密成功字符串: ```python succ = bytes.fromhex("9fe39b91f5ee9feaa691e9ed96deb7") key = b"yb6tcr" print(bytes(succ[i] ^ key[i % 6] for i in range(len(succ))).decode()) ``` 输出: ```text 恭喜成功! ``` 将 `yb6tcr` 输入程序,也成功输出: ```text 恭喜成功! ``` ## 最终答案 ```text yb6tcr ```
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
F1ux_Team
1
10
发帖
0
回帖
70
RANK
关注
私信
他的文章
[原创] 第十题:卯时·曦光初现
325
[原创] 第九题:丑寅同墟·星海抉择 Writeup
18
[原创]第五题 申时·忆海倒带 Writeup
834
[原创]第六题:酉时·书院迷局 Writeup
587
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部