前言 这次比赛虽然参加了,但是一道题也没写出来。全程陪跑,就像下界凡夫俗子误入天界上仙打架一样,赛后官方放出wp,必须猛猛学习复现一波,见见世面。
Misc SU_Signin 签到题
去重即可,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这篇文章中关键信息,这个是
一个是我的世界,还有就是2hishu这位师傅(misc的大手子),还有就是在下面有个mc图片,有一个id,Mnzn233,直接搜这个id就行
这里可以看到用户名历史就有13个名字,然后用https://instantusername.com检索TurbidCloud的社交账号
进入这个群聊得到字符串
ddc7-4622-8a97
然后就是看余下的文章,在那个邮箱截图
开启了自动回复,还有一个邮箱后缀@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 hashlibdict_file = "E:\\工具\\cupp-master\\evanlin.txt" target_hash = "105e127d86711d05460e6072f7d809c5c9e0fe095ca7631e4c2e0ffc4acc3fa9" 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 : print ("未找到匹配的密码" ) except FileNotFoundError: print (f"错误:未找到字典文件 {dict_file} ,请检查路径" )
邮箱是evanlin1123@foxmail.com,发送邮件即可
名字是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
1 bkcrack -C attachment.zip -c challenge.avif -x 4 66747970617669730000000061766973
使用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 osimport sysfrom PIL import Imagetry : import pillow_avif except ImportError: print ("请先安装:D:/python/python.exe -m pip install pillow-avif-plugin pillow" ) sys.exit(1 ) 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 文件夹" )
然后拼成这样这是汉信码
扫描得到0f87b6f831b312a0b6748c4a792b9362c033c75cc230aae63be2c9cfab12a0e4,随波逐流分析task附件得到一个wav,一个zip
首先分析这个wav
观察这波形图可知上下轨道是波峰与波谷相对当上方轨道 (左声道)出现一个向上 的尖峰(波峰)时,下方轨道 (右声道)在同一垂直位置正好是一个向下 的深谷(波谷),这就说明左右声道相反,然后就离立体声到单声道,轨道->混音->混音并渲染来,直接看看不出来,用多视图看
稍微调整一下
… ..- .–. . .-. .. -.. — .-..
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分析一波
这一点出题人也说了,用传统古代密码可以用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 binasciiimport zlibfrom Crypto.Cipher import AESfrom Crypto.Util import CounterPAYLOAD_HEX = "0a6bd41815d0d2af8b30c25ce506b2ead194b0f3c4186913c80d2a2b" KEY_HEX = "0f87b6f831b312a0b6748c4a792b9362c033c75cc230aae63be2c9cfab12a0e4" try : key = binascii.unhexlify(KEY_HEX) cipher_data = binascii.unhexlify(PAYLOAD_HEX) ctr = Counter.new(128 , initial_value=1 , little_endian=True ) aes = AES.new(key, AES.MODE_CTR, counter=ctr) raw = aes.decrypt(cipher_data) try : raw = zlib.decompress(raw, -15 ) except zlib.error: pass print ("🔍 解密原始二进制(十六进制):" , raw.hex ()) try : print ("🔍 解密结果(UTF-8文本):" , raw.decode('utf-8' )) except UnicodeDecodeError: try : print ("🔍 解密结果(GBK文本):" , raw.decode('gbk' )) except : print ("🔍 解密结果(无法解码为文本,仅二进制)" ) except Exception as e: print ("❌ 解密失败:" , str (e)) print ("常见原因:\n1. 计数器参数不匹配(initial_value/little_endian)\n2. 密钥错误\n3. 密文被篡改" )
最后感叹一下大佬牛逼!!!,其他的看wp大佬用1200行脚本解题这真学不会,下去沉淀了。