0%

suctf2026

前言

这次比赛虽然参加了,但是一道题也没写出来。全程陪跑,就像下界凡夫俗子误入天界上仙打架一样,赛后官方放出wp,必须猛猛学习复现一波,见见世面。

Misc

SU_Signin

签到题

image-20260317181101184

去重即可,SUCTF{W3lc0me_2_SUC7F2026!!!!}

SU_CyberTrack

官方题解:SUCTF2026-CyberTrack 出题人 WP - Mnzn の 小屋

English? ? no,no,no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
描述
互联网的记忆力远超人们的想象。
你发现了一个看似属于安全爱好者的个人博客。乍看之下,它只是一个简单的网站,包含日常笔记和技术文章。然而,散落在网页上的零碎信息可能揭示出远超预期的内容。
追踪这些数字痕迹,将散落在互联网各处的碎片拼凑起来。尝试重构隐藏的线索,看看最终会指向何方。
最终的flag是构造字符串的MD5哈希值。
flag构造方法
该字符串的构造方法是:将目标人物的姓名与已发现的字符串连接起来,然后将整个结果转换为小写,最后计算MD5哈希值。
姓名格式
使用以下格式:
姓氏 + 名字
规则
移除所有空格
姓氏和名字之间不要有任何分隔符
姓名顺序应为姓氏在前,名字在后
最终格式规则
md5(lowercase(<姓氏><名字> + "_" + <字符串>))
示例
姓名:Sanfeng Zhang
字符串:abcd-dcba
生成的字符串:
zhangsanfeng_abcd-dcba
Flag:
SUCTF{md5(zhangsanfeng_abcd-dcba)}

这一题就是要找到一个字符串,还有一个名字,在和我一起玩t_t这篇文章中关键信息,这个是image-20260317163731550

一个是我的世界,还有就是2hishu这位师傅(misc的大手子),还有就是在下面有个mc图片,有一个id,Mnzn233,直接搜这个id就行

image-20260317164614191

image-20260317164247856

这里可以看到用户名历史就有13个名字,然后用https://instantusername.com检索TurbidCloud的社交账号

image-20260317172204613

进入这个群聊得到字符串

img

ddc7-4622-8a97

然后就是看余下的文章,在那个邮箱截图

img

开启了自动回复,还有一个邮箱后缀@foxmail.com,只要知道这个邮箱,并发送邮件这个邮箱就会自动回复然后署名就是目标人物的姓名。然后就是从那个头像下手,这是博客头像的连接

1
https://gravatar.com/avatar/105e127d86711d05460e6072f7d809c5c9e0fe095ca7631e4c2e0ffc4acc3fa9

该 URL 是Gravatar 全球通用头像服务的头像获取地址,格式为https://gravatar.com/avatar/[哈希值],其中后缀的105e127d86711d05460e6072f7d809c5c9e0fe095ca7631e4c2e0ffc4acc3fa9是对应邮箱地址的哈希值(Gravatar 默认通过邮箱小写后计算的 MD5 哈希关联头像)。

检索所有博客,提取一下信息

1
2
3
4
5
6
7

Today -> 布偶猫 Momo
Normal life -> 同事 shukuang
Happy birthday -> ⽣⽇ 2024年11⽉23⽇
Play with me t_t -> 游戏ID Mnzn233
博客提供的昵称 EvanLin

使用cupp生成字典,邮箱格式是payload@foxmail.com,哈希值是105e127d86711d05460e6072f7d809c5c9e0fe095ca7631e4c2e0ffc4acc3fa9,写一个脚本爆破

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
import hashlib


dict_file = "E:\\工具\\cupp-master\\evanlin.txt"
target_hash = "105e127d86711d05460e6072f7d809c5c9e0fe095ca7631e4c2e0ffc4acc3fa9"

# 增加:同时尝试MD5(Gravatar常用)和SHA256
def calculate_hash(s, algo="sha256"):
if algo == "md5":
return hashlib.md5(s.encode()).hexdigest()
elif algo == "sha256":
return hashlib.sha256(s.encode()).hexdigest()

try:
with open(dict_file, "r", encoding="utf-8", errors="ignore") as f:
line_num = 0 # 增加:显示进度
for line in f:
line_num += 1
candidate = line.strip()
if not candidate: # 跳过空行
continue

email = candidate + "@foxmail.com"
# 同时计算两种哈希
md5_result = calculate_hash(email, "md5")
sha256_result = calculate_hash(email, "sha256")

if md5_result == target_hash:
print(f"MD5匹配成功!第{line_num}行 | 邮箱:{email}")
break
elif sha256_result == target_hash:
print(f"SHA256匹配成功!第{line_num}行 | 邮箱:{email}")
break
else: # 循环正常结束(未break),说明无匹配
print("未找到匹配的密码")
except FileNotFoundError:
print(f"错误:未找到字典文件 {dict_file},请检查路径")

image-20260317180110711

邮箱是evanlin1123@foxmail.com,发送邮件即可

image-20260317180507300

名字是Zeyuan Lin,按照题目要求md5(linzeyuan_ddc7-4622-8a97)

SUCTF{c4d1df3b3dbea17c886b447b7f913048}

SU_chaos

附件是一个加密压缩包,不是伪加密,爆破密钥也没成功,尝试明文攻击,附件中有acif文件,尝试用acif或者avis文件特征进行明文攻击

1
bkcrack.exe -C attachment.zip -c challenge.avif -x 4 66747970617669660000000061766973

image-20260317201201210

1
bkcrack -C attachment.zip -c challenge.avif -x 4 66747970617669730000000061766973

image-20260317195729419

使用avis文件头明文攻击攻击成功,avif可以理解成一个图片,avis可以理解为gif这个challenge.avif用vscode打开可以到像gif一样是动图,需要分帧拼接二维码,exp

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
import os
import sys
from PIL import Image

# 加载AVIF解码器(新版自动注册)
try:
import pillow_avif
except ImportError:
print("请先安装:D:/python/python.exe -m pip install pillow-avif-plugin pillow")
sys.exit(1)

# 拆分AVIF动图核心函数
def extract_avif_frames():
avif_file = "challenge.avif"
output_dir = "avif_frames"

# 检查文件+创建目录
if not os.path.exists(avif_file):
print("文件不存在:", avif_file)
return
os.makedirs(output_dir, exist_ok=True)

# 逐帧拆分并保存
with Image.open(avif_file) as im:
for idx in range(getattr(im, 'n_frames', 1)):
im.seek(idx)
im.save(f"{output_dir}/frame_{idx+1:03d}.png", format="PNG")

if __name__ == "__main__":
extract_avif_frames()
print("拆分完成,帧文件保存在 avif_frames 文件夹")

然后拼成这样这是汉信码

image-20260317204116616

image-20260317204445223

扫描得到0f87b6f831b312a0b6748c4a792b9362c033c75cc230aae63be2c9cfab12a0e4,随波逐流分析task附件得到一个wav,一个zip

首先分析这个wavimage-20260317211808176

观察这波形图可知上下轨道是波峰与波谷相对当上方轨道(左声道)出现一个向上的尖峰(波峰)时,下方轨道(右声道)在同一垂直位置正好是一个向下的深谷(波谷),这就说明左右声道相反,然后就离立体声到单声道,轨道->混音->混音并渲染来,直接看看不出来,用多视图看

image-20260317212251229

稍微调整一下

image-20260317213343477

… ..- .–. . .-. .. -.. — .-..

image-20260317213547508

SUPERIDOL使用deepsound提取隐藏信息,SUPERIDOL就是密码,隐藏文件时secret.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A:寒江夜阔云初散,秋灯入梦染空山。潮声拍岸惊归鹤,旧径松深客未还。
B:星沉古岸月微寒,竹林深锁远钟音。长江如练横天际,画舟轻渡入云岚。
A:你刚写的那几句,我真挺喜欢的,看着很安静。
B:真的?我还怕有点太那个了。你那句一下就把情绪点出来了。
A:可能就是那一瞬间的感觉吧,说不清楚,但心里动了一下。
B:我也是。读你的时候,会有种“哦,他懂这个”的感觉,挺难得的。
A:那还是老样子,以诗做表相切,一二三四,阴阳上去,定为声调
A:
3-21-1
10-21-4
13-7-4
2-9-4
15-15-2
0-28-1
28-22-1
B:甚好,待等有缘人探所之文,寻我二者之密

ai分析一波

image-20260317214338266

这一点出题人也说了,用传统古代密码可以用ai分析出来,就这都很难了,能分析到这已经很不容易了。然后密码时密文的md5,密码就是2e4dc1dad6e4c0747371a041cb177dd7,接出来的内容是

1
$zip2$*0*3*0*ee1f6cc09449ea4174cb45bd0d667d1c*258b*1c*0a6bd41815d0d2af8b30c25ce506b2ead194b0f3c4186913c80d2a2b*408973cbd18faafa7355*$/zip2$

可以理解为上面的是密文,还有一个数据0f87b6f831b312a0b6748c4a792b9362c033c75cc230aae63be2c9cfab12a0e4没用过可以当作密码,exp

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
import binascii
import zlib
from Crypto.Cipher import AES
from Crypto.Util import Counter

# 核心参数(和你的密文/密钥完全匹配)
PAYLOAD_HEX = "0a6bd41815d0d2af8b30c25ce506b2ead194b0f3c4186913c80d2a2b"
KEY_HEX = "0f87b6f831b312a0b6748c4a792b9362c033c75cc230aae63be2c9cfab12a0e4"

try:
# 1. 转换为二进制
key = binascii.unhexlify(KEY_HEX)
cipher_data = binascii.unhexlify(PAYLOAD_HEX)

# 2. 初始化AES-CTR计数器(关键:需匹配加密时的参数)
# 先尝试初始值1(小端序),若失败可尝试初始值0/2,或大端序(little_endian=False)
ctr = Counter.new(128, initial_value=1, little_endian=True)
aes = AES.new(key, AES.MODE_CTR, counter=ctr)

# 3. 解密
raw = aes.decrypt(cipher_data)

# 4. 尝试解压(加密前可能压缩)
try:
raw = zlib.decompress(raw, -15) # -15:兼容无头部的zlib压缩
except zlib.error:
pass

# 5. 输出结果(多格式兼容)
print("🔍 解密原始二进制(十六进制):", raw.hex())
try:
print("🔍 解密结果(UTF-8文本):", raw.decode('utf-8'))
except UnicodeDecodeError:
# 尝试其他编码(如GBK、ASCII)
try:
print("🔍 解密结果(GBK文本):", raw.decode('gbk'))
except:
print("🔍 解密结果(无法解码为文本,仅二进制)")

except Exception as e:
print("❌ 解密失败:", str(e))
print("常见原因:\n1. 计数器参数不匹配(initial_value/little_endian)\n2. 密钥错误\n3. 密文被篡改")

image-20260317220424176

最后感叹一下大佬牛逼!!!,其他的看wp大佬用1200行脚本解题这真学不会,下去沉淀了。