
WMCTF 2025

Misc
phishing email
Challenge
某公司安全工程师告警捕获一起邮件钓鱼样本,请帮助排查分析
A security engineer from a certain company has detected a phishing email sample. Please assist in investigation and analysis.
百度网盘:https://pan.baidu.com/s/1L1jBvqcpEI03uBlYsm0KAQ?pwd=ywr7
Google Dirve: https://drive.google.com/file/d/1U9RRjLNT6YRbHcXUesbPXL2a591bSX4m/view?usp=drive_link
Solution
从邮件附件得到以下 XML 代码:
1 |
|
其中夹杂着恶意的 js 代码。
分析恶意代码发现真正的核心数据有两部分:
- 加密数据:
polymorphicData
数组。代码明确指出有效部分为索引3
到7
。 - 解码映射表:
char_map
变量,它定义了加密编码(如'4oyM'
)到明文字符(如'w'
)的对应关系。
直接执行 decryptionPipeline
中的字符替换会得到一个以 wmctwf{
的字符串,这和实际的 flag 开头 ``wmctf{` 十分接近,推测后续的 XOR 是用于干扰的,因此只要专注于第一步的解密即可。
观察发现编码 '4oyM'
(对应字符 'w'
)在加密数据中出现了两次,这使得结果 wmctwf{
中出现了第二个 w
,由此推断 char_map
中的每一个编码在整个解码过程中只能被使用一次。
1 | import re |
运行得到 flag:
1 | wmctf{SVG_Phishing_Attack_Detection_Evasion} |
Voice_hacker
Challenge
你能偷取他的声音吗?
Can you steal his voice?
百度网盘:https://pan.baidu.com/s/1ygNDlVCkRZZt6NKjGU-1xA?pwd=tzv8
Google Dirve: https://drive.google.com/file/d/1OTCqmrymIT85vJwJAWIl9s1elORY0-Rh/view?usp=drive_link
Solution
附件是流量包文件 out.pcap
,其中只包含UDP流量。从题目描述以及靶机要求录音 CTF,启动!
不难判断出这些流量传输的是音频数据。综合来看本题的目标是从流量包中提取出音频文件,将其克隆后生成内容为”CTF,启动!“的 wav 音频然后调用接口上传。
先用 tshark 把 UDP 包的 Payload 提取出来:
1 | tshark -r out.pcap -T fields -e data > out.txt |
先分析头三行数据:
1 | 800000000000000012345678fdfbfbfbfcfdfefdfdfdfcfcfdfdfdfdfdfdfdfdfdfefdfdfefefefefffefefefefefefefefefefefefefefefffeffff7e7e7e7eff7efffefefefdfefefefeffffff7e7e7e7e7e7e7e7efffefefefefefefefefeffff7e7e7e7d7e7e7efffffefefdfefdfefefeff7e7e7e7e7e7e7e7efffffefefefdfdfefeffff7e7e7d7d7d7e7e7efffefefefdfdfefefefeff7e7e7d7d7d7d7e7e7efffefefdfdfdfdfdfe |
注意到前12个字节 80 00 00 00 00 00 00 00 12 34 56 78
具有非常明显的 RTP 协议特征,这是专门用于在 IP 网络上传输音视频的标准协议。
我们来解析这个RTP头部:
- 80: 版本号(V=2)
- 00: 标记位(M=0),载荷类型 (Payload Type, PT) = 0
- 00 00: 序列号 (Sequence Number) = 0
- 00 00 00 00: 时间戳 (Timestamp) = 0
- 12 34 56 78: 同步源标识符 (SSRC),用于标识唯一的媒体流
其中最关键的信息是 Payload Type (PT)。根据RFC 3551标准,PT = 0 代表 PCMU (Pulse Code Modulation, μ-law),也就是 G.711 μ-law 编码。
G.711 μ-law 编码具有以下特性:
- 采样率 (Sample Rate): 8000 Hz
- 采样深度 (Bit Depth): 8 bits per sample
- 声道数 (Channels): 1 (单声道, Mono)
- 性质: 一种非线性的对数压缩编码,常用于电话系统
通过对比前三条流量的RTP头部,我们发现了清晰的规律:
包编号 | 序列号 (Seq Num) | 时间戳 (Timestamp) | SSRC | 音频数据长度 |
---|---|---|---|---|
1 | 0 | 0 | 0x12345678 | 160 字节 |
2 | 1 | 160 (0xa0) | 0x12345678 | 160 字节 |
3 | 2 | 320 (0x140) | 0x12345678 | 160 字节 |
- 每个包的序列号递增 1,表明是连续的 RTP 包
- SSRC 不变,表明所有包都属于同一个音频流
- 每个包的时间戳增加 160,每个RTP包携带了 160 字节的音频数据,由于 G.711 每个采样点占 1 字节,所以 160 字节就代表 160 个采样点
用脚本从中提取出音频:
1 | import wave |
提取出来的音频是一段对话。先用音频处理软件将其中的女声去除,仅保留男声。然后在网上随便找一个克隆声音的项目,把处理好的音频文件丢上去让它读 CTF,启动!
,最后用下面这个脚本上传音频进行检测即可:
1 | import requests |
得到的输出中包含 flag:
1 | 状态码: 200 |
1 | WMCTF{01a9a4f1-e748-43fa-8d6d-bba372016adc} |
GitHacker
Challenge
To be a GitHacker.
百度网盘:https://pan.baidu.com/s/18iCGk0EHLha1rUAwdMEKMA?pwd=y8c4
Google Dirve: https://drive.google.com/file/d/1sppWgVmrz8t0C6YeXqJIHKUCaPFgCc-U/view?usp=drive_link
View Hint: Hint 1
file is not image
文件不是图片
Solution
先检查引用日志:
1 | $ git reflog |
%%{init: {"gitGraph": {"mainBranchName": "master"}}}%% gitGraph commit id: "6b6285c" commit id: "6ec92bc" tag: "添加文件 image.png" %% --- 第一次 reset --- branch "abandoned-path-1" checkout "abandoned-path-1" commit id: "a026274" tag: "password:EasyP@ssw0rd_from_Git_History" checkout master commit id: "93ab7b9" tag: "change password" %% --- 第二次 reset --- branch "abandoned-path-2" checkout "abandoned-path-2" commit id: "d504bbf" tag: "添加文件 image.jpg" checkout master commit id: "484c0d3"
按顺序逐个检查:
1 | $ git show 6b6285c |
1 | $ git show 6ec92bc |
1 | $ git show a026274 |
1 | $ git show 93ab7b9 |
1 | $ git show d504bbf |
1 | $ git show 484c0d3 |
先分别把文件给还原了:
1 | $ git checkout 6ec92bc -- image.png |
经尝试,image.png
和 image.jpg
均为 VeraCrypt 的加密容器。
其中,image.png
的密码是 a026274
中的 password.md
的内容 EasyP@ssw0rd_from_Git_History
,在该容器内的 flag.txt
中找到 flag 的前半段:
1 | Congratulations! This is half of the gift I gave you: |
经比对哈希发现 image.png
和 image.jpg
是两个不同的文件,且密码 EasyP@ssw0rd_from_Git_History
无法解密容器 image.jpg
。
没有找到第二个密码,参考这个帮助文档 [更改密码和密钥文件](https://veracrypt.io/zh-cn/Changing Passwords and Keyfiles.html),综合上面的 commit 填写的是 “change password” 而非 “change master key” 可以推测第二个容器只更改了密码,主密钥没变,因此使用 VeraCrypt 自带的 备份加密头信息
和 恢复加密头信息
功能即可解开第二个容器。步骤如下:
- 打开 VeraCrypt
- 选择文件
image.png
- 选好之后依次点击菜单栏的
工具
->备份加密卷头信息
-> 输入密码EasyP@ssw0rd_from_Git_History
->此加密卷不包含隐藏加密卷
->是
-> 保存到任意一个文件(这里我保存到header
) ->继续
- 此时在你指定的目录下就会出现文件
header
,回到 VeraCrypt 主界面 - 选择文件
image.jpg
- 选好之后依次点击菜单栏的
工具
->恢复加密卷头信息
->从外部备份文件中恢复加密头信息
->是
-> 选择前面生成的文件header
-> 输入密码EasyP@ssw0rd_from_Git_History
->继续
->确定
- 最后直接挂载
image.jpg
即可,密码是EasyP@ssw0rd_from_Git_History
在该容器内的 flag.txt
中找到 flag 的后半段:
1 | Congratulations! You've solved it! |
拼起来得到完整 flag:
1 | WMCTF{G00d_J0b_F1nding_Th3_0ld_V3rsi0n_And_Y0u_M4ster_The_VeraCrypt_H34der_Trick!} |
- 标题: WMCTF 2025
- 作者: Aristore
- 创建于 : 2025-09-22 10:30:00
- 更新于 : 2025-09-22 10:27:48
- 链接: https://www.aristore.top/posts/WMCTF2025/
- 版权声明: 版权所有 © Aristore,禁止转载。