“轩辕杯” 云盾砺剑 CTF 挑战赛 2025

赛后复现的题目标题前用🔁标注。感谢群内大佬的解惑。

Misc

音频的秘密

Chllenge

音频也会有秘密吗?

Solution

一开始还以为是摩斯电码,在这里耗了很长时间(好气)

SilentEye 提取隐写文件,sound quality 选 low

xuanyuanbei-1

拿到加密压缩包

xuanyuanbei-2

爆破得到密码 1234

xuanyuanbei-3

LSB 隐写拿到 qzvk{Ym_LOVE_MZMP_30vs6@_nanmtc_q0i_J01_1}

xuanyuanbei-4

结合这个不难猜到是维吉尼亚加密,密码就是 lovely

xuanyuanbei-5

1
flag{No_AAAA_BBBB_30ao6@_cccyyy_f0k_Y01_1}

Terminal Hacker

Challenge

黑客的世界,从敲下第一个命令开始…… 进入你的终端,尝试找出那串藏在系统深处的字符串。 附件: hacker.exe 找到隐藏的 flag。 flag 格式: flag

Solution

先用 pyinstxtractor 解包,然后用 pycdc 反编译

xuanyuanbei-6

1
flag{Cysay_terminal_game_hacked_successfully}

数据识别与审计

Challenge

公司管理员在商品测评汇总平台中的文件服务器,存放了一些商品相关或者用户上传的文件数据,包括 TXT,图片,PDF,音频数据。在各种数据中,可能泄露了一些敏感信息或者某些用户插入了恶意代码到 各种类型数据中,每个类型有 5 个。请选手对于各种数据类型的文件进行审计,找到带有敏感信息或者恶意代码的数据文 件,并将文件名列出来。flag 为 md5 (文件名排序)

排序规则:TXT > 图片 > PDF > 音频数据,且数字 > 大小写字母 例如:提取的答案是 1a.txt,q5.txt,Qa.txt,aa.pdf,b.png, 则 flag 为 flag {md5 (1a.txt,q5.txt,Qa.txt,b.png,aa.pdf)}=flag

Solution

TXT

先合并文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os

# 定义路径
txt_folder = r"E:\杂项\数据审计\txt"
output_file = r"杂项\数据审计\output.txt"

# 获取所有 .txt 文件(按修改时间排序)
txt_files = sorted(
[f for f in os.listdir(txt_folder) if f.endswith('.txt')],
key=lambda x: os.path.getmtime(os.path.join(txt_folder, x))
)

# 用于记录已出现的内容和对应的文件名列表
content_map = {}

# 遍历所有文件,读取内容并归类
for filename in txt_files:
file_path = os.path.join(txt_folder, filename)

try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()

# 如果内容已经在字典中,添加文件名到该内容对应的列表中
if content in content_map:
content_map[content].append(filename)
else:
content_map[content] = [filename]

except Exception as e:
print(f"读取文件 {filename} 出错:{e}")

# 写入结果到输出文件
with open(output_file, 'w', encoding='utf-8') as out_f:
# 按照原始顺序处理每个唯一内容块(如果需要保持首次出现顺序)
seen_contents = set()

for filename in txt_files:
file_path = os.path.join(txt_folder, filename)

if filename not in seen_contents:
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()

# 如果这个内容还没写过
if content not in seen_contents:
# 找出所有同内容的文件名
same_content_files = content_map[content]
# 合并文件名
combined_names = ', '.join(same_content_files)

# 写入合并的文件名行
out_f.write(combined_names + '\n')
# 写入内容
out_f.write(content + '\n\n') # 每个内容之间空两行

# 标记为已写入
seen_contents.update(same_content_files)

except Exception as e:
out_f.write(f"[读取错误:{filename}] {e}\n")

FiBRFFnG.txt

xuanyuanbei-7

9h0zQJok.txt

xuanyuanbei-8

T0BPOXDY.txt

xuanyuanbei-9

Me4CoMw7.txt

xuanyuanbei-10

gWa0DiTs.txt

xuanyuanbei-11

1
9h0zQJok.txt,FiBRFFnG.txt,gWa0DiTs.txt,Me4CoMw7.txt,T0BPOXDY.txt
图片

看了所有图片的属性,甚至怀疑过借着透明图层隐藏信息,都失败了

不过后来转念一想题目提到了恶意代码,于是猜测是文件尾的一句话木马,写个脚本检测一下(一开始是找的 php,不过由于出来的结果只有两个符合标准并且都带有 cmd,所以把这里的关键词改为了 cmd 来扩大范围)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os

# 设置目标目录
target_dir = r'杂项\数据审计\png'

# 遍历目录及子目录中的所有文件
for root, dirs, files in os.walk(target_dir):
for file in files:
file_path = os.path.join(root, file)

try:
with open(file_path, 'rb') as f: # 以二进制模式打开文件
content = f.read()

if b'cmd' in content:
print(file)
continue
except Exception as e:
print(f'[!] 读取文件出错: {file_path},错误: {e}')

输出如下

1
2
3
4
5
6
7
8
9
10
100uc1uh.png
3qc0mmfh.png
a4ijc0fu.png
b7aykkl9.png
blz2lvtj.png
cn9b4gct.png
lhf82t3d.png
sofhifed.png
ubh4lmwb.png
wxrozxe3.png

逐个检查文件尾即可得到答案

1
a4ijc0fu.png,b7aykkl9.png,lhf82t3d.png,sofhifed.png,wxrozxe3.png
PDF

用 Adobe Acrobat DC 一次性全部打开,发现里面有部分 PDF 存在 JS 脚本,弹窗显示了 XSS in PDF,于是用脚本检测可疑的 PDF 文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os

folder_path = r'杂项\数据审计\pdf'

# 遍历 pdf 文件
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith('.pdf'):
file_path = os.path.join(root, file)
try:
with open(file_path, 'rb') as f:
content = f.read()
if b"/JS" in content:
print(file)
continue
except Exception as e:
print(f"无法读取文件 {file_path}: {e}")

得到输出

1
2
3
4
5
6
bVKINl.pdf
DzVuCy.pdf
hnPRx1.pdf
mIR13t.pdf
OGoyOG.pdf
rSG2pW.pdf

逐个打开发现 DzVuCy.pdf 不存在脚本,因此这部分的答案就是剩下的 5 个

1
bVKINl.pdf,hnPRx1.pdf,mIR13t.pdf,OGoyOG.pdf,rSG2pW.pdf
WAV

xuanyuanbei-12

用 AU 打开,按采样率排序就会发现这几个音频的采样率不一样

1
Bd2IYe3.wav,bjVwvcC.wav,H0KDChj.wav,ou9E9Mh.wav,UEbzH4X.wav
拼接
1
9h0zQJok.txt,FiBRFFnG.txt,gWa0DiTs.txt,Me4CoMw7.txt,T0BPOXDY.txt,a4ijc0fu.png,b7aykkl9.png,lhf82t3d.png,sofhifed.png,wxrozxe3.png,bVKINl.pdf,hnPRx1.pdf,mIR13t.pdf,OGoyOG.pdf,rSG2pW.pdf,Bd2IYe3.wav,bjVwvcC.wav,H0KDChj.wav,ou9E9Mh.wav,UEbzH4X.wav
1
flag{234ed8ef5421c5e559420dbf841db68f}

🔁一大碗冰粉

Challenge

你是大黑客,这次你入侵了 icej3lly 的个人电脑,准备跟踪他的行踪,但是 icej3lly 好像并不害怕⌓‿⌓,还跟你玩起了加密游戏,甚至把提示都给你了ƪ(˘⌣˘)ʃ。但当你正在查看桌面上的秘密文件和提示时突然断电了,只留下了这个内存镜像,多疑的你一定会有所发现吧˃ʍ˂

Solution

在桌面发现压缩包 secret.zip 然后发现它是完全损坏的

在桌面 ctf 文件夹中发现 hint.txt,得到提示 doyouknowplaintextattack

vol3 把这个压缩包导出

xuanyuanbei-13

打开发现要密码,结合前面的提示使用明文攻击,很显然这里用正是前面得到的 hint.txt,经过比较 CRC 值证实了这一猜想

xuanyuanbei-14

明文攻击得到三个密钥 75a1a160 d4d2cd93 ebdc5c33,然后从解压得到的 mimi.zip 解压得到疑惑吗?疑惑就对了.search

疑惑谐音异或,解密密钥是 search

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def xor_decrypt(data: bytes, key: str) -> bytes:
key_bytes = key.encode('utf-8')
result = bytearray(len(data))
for i in range(len(data)):
result[i] = data[i] ^ key_bytes[i % len(key_bytes)]
return result

def decrypt_file(input_path: str, output_path: str, key: str):
try:
with open(input_path, 'rb') as f:
encrypted_data = f.read()

decrypted_data = xor_decrypt(encrypted_data, key)

with open(output_path, 'wb') as f:
f.write(decrypted_data)

print(f"解密完成,文件已保存到:{output_path}")

except Exception as e:
print(f"发生错误:{e}")

if __name__ == "__main__":
input_file = "疑惑吗?疑惑就对了.search"
output_file = "解密后的文件.bin"
key = "search"

decrypt_file(input_file, output_file, key)

从文件头判断解密得到的二进制文件时压缩包

xuanyuanbei-15

修改后缀为.zip 后尝试解压发现要密码,扔随波逐流发现是伪加密并修复了

xuanyuanbei-16

解压得到图片 flag.jpg

xuanyuanbei-17

LSB 发现 flag

xuanyuanbei-18

接下来是 OSINT

xuanyuanbei-19

抖音搜索找到这家店在连云港市海州区路南街道陇海中路盐河巷

xuanyuanbei-20

1
flag{江苏省连云港市海州区陇海步行街}

🔁哇哇哇瓦

Challenge

有款游戏越打越饥饿就是电脑瓦罗兰特,这里没有人给你压力,全是妹妹加油打气,我很清楚你没什么实力但是瓦妹不离不弃,大妹子声甜技术又好,少萝御姐概率不小…

Solution

xuanyuanbei-21

发现 flag 的前半部分 flag{Val0rant_1s_th3_,还发现一藏了一个 zip 压缩包

binwalk 把压缩包提出来,解压拿到提示密码是场上存活的两位英雄的英文名字连起来(区分大小写) 什么?你不知道密码在哪用?!那我问你,隐写都知道,明写看不见?拿你瞄准时的眼力仔细观察观察图片中的角落吧

右下角发现明显 LSB 隐写痕迹

xuanyuanbei-22

顺序改为 BGR,除了透明图层以外的全选,MSB 优先

xuanyuanbei-23

发现压缩包的文件头 PK,导出来用脚本反转

1
2
3
4
5
6
7
8
9
10
input_file = "瓦学弟天天开心.bin"
output_file = "瓦学弟天天开心.zip"

with open(input_file, 'rb') as f:
data = f.read()

reversed_data = data[::-1]

with open(output_file, 'wb') as f:
f.write(reversed_data)

xuanyuanbei-24

发现解压要密码,根据前面的提示搜索发现两位英雄的名字分别是 Gekko 和 Yoru,经尝试得到解压密码为 GekkoYoru

xuanyuanbei-25

得到 flag 的后半段 best_FPS_g@me!!}

1
flag{Val0rant_1s_th3_best_FPS_g@me!!}