一、贝斯手
解压后里面有四个东西,其中打开介绍.txt,拉到最后有提示:
那就是1992,用1992解压flag.zip的加密压缩包
得到:5+58==
327a6c4304ad5938eaf0efb6cc3e53dcCFmZknmK3SDEcMEue1wrsJdqqkt7dXLuS
5+58是一行,下面的这串是一行,所以分开理解,上面的意思是MD5和base58编码,下面的是需要解密的东西。MD5通常为32为十六进制字符,于是前32位MD5解密得到:
后面base58解密得到:
得到flag{this_is_md5_and_base58}
二、FileStoragedat
下载解压后是一个.dat文件,data文件没有确定类型,这里我猜测是图片,先按照图片的思路试试,写一段脚本,将文件头和常见文件格式进行异或,看能否得到一个固定值,这个.dat文件头可以在随波逐流里看到:
cipher_hex = "17ced0d993948494" cipher_bytes = bytes.fromhex(cipher_hex) # 常见图片格式头 (取前8位) formats = { "PNG": "89504e470d0a1a0a", "JPG": "ffd8ffe000104a46", # JPEG通常以FF D8 FF开头 "GIF": "4749463839610100" # GIF89a } for name, fmt in formats.items(): plain_bytes = bytes.fromhex(fmt) key = bytes([c ^ p for c, p in zip(cipher_bytes, plain_bytes)]) print(f"尝试匹配 {name}:") print(f" 推导出的前8位 Key: {key.hex()}")ok成功,能看出是png格式,那就再写一段脚本解密还原:
key = 0x9e # 你推导出来的关键字节 with open('你的文件名.dat', 'rb') as f_in: data = f_in.read() # 对每一个字节进行异或 decrypted = bytes([b ^ key for b in data]) # 将解密后的结果存为 .png 文件 with open('result.png', 'wb') as f_out: f_out.write(decrypted) print("解密完成,请检查 result.png")得到一张图片,图片里有bugku{WeChatwithSteg0}。
然后这道题还有一个贼简单的解法:微信PC电脑版 images 目录 dat 格式图片文件在线解密转换工具
使用这个在线网站,直接拖这个文件进去,1秒就出结果。
只能说,学无止境,又学会一招!
三、Where is flag 番外篇
这题很有意思,脑洞很大。首先下载来是两个压缩包,一个key,一个出师表。出师表.rar还需要解压密码,于是先看key这个文件夹,里面就是13个txt,打开是每一小段的出师表,唯一可入手的是文章末尾加了不同数量的字母。
第一个结尾5个A,第二个8个A,第三个没有,那就能想到,这玩意大概率是用来凑字数,也就是凑文件大小的,那试试从文件大小入手。
我靠还真是……用winrar打开key.rar,每个文件的大小算一下差值:353-278=75,284-183=101
以此类推,最后得到一串数字:75 101 121 58 90 104 117 71 76 64 64 46 48
这串数字小于128,判断为ascii码,解码得:Key:ZhuGL@@.0
这就是第二个出师表.rar的压缩密码。
这里我已沉默我已力竭,我想能不能直接爆破得到压缩包密码我试试:
拉倒吧……
解压出来后得到一张图片,用记事本打开文件搜索flag得到: flag in here {LjFWBuxFNTzEWv6t2NfxjNFSH1sQEwBt5wTTLD1fJ}
直接再随波逐流一键解码:
这道题目就是脑洞很大,挺有意思的。
四、键盘
需要解压密码,先别急着爆破,看看是否是伪加密:
伪加密,那就直接随波逐流工具zip伪加密修复,然后就打开了
发现一个密码文件:wxad-tbfh-yngj-rvdg
输入后发现打不开flag文件,迷茫,然后突然想到这道题目叫键盘,waxd中间围着的就是s,于是猜测密码是s-g-h-f,输入试试,打开了,需要连输两遍,把图片挪开就看到flag了。
这道题目需要再细心一些,用随波逐流做伪加密很好用,但最后的密码确实还得拐个弯。
五、数独
很新的一道题目,下载解压后是一张数独图片和一个网页。
网页直接查看源码,试着找flag,真找到了:
随波逐流一键解码:
fine,就知道没那么容易。
得到的flag内容我随手复制到记事本里,神奇的事情发生了:
这些夹杂在正常字母和数字中间的小方块(俗称“豆腐块”字符),正是用来藏匿 Flag 的零宽字符很明显是一个零宽加密!
那就解密看看,得到:
解密后显示:用什么处理器的手机玩五,那我们可以得出结论了,图片是五子棋,且最后flag应该提交的是手机的处理器型号!
既然给出了5,我觉得可能他要的就是出现5次的处理器型号,而且flag应该不能是中文吧,所以写一段代码,把所有字母+数字的处理器名称都提取出来,看哪个出现了5次。
import re from collections import Counter # 读取文件 with open('海信手机.html', 'r', encoding='utf-8') as f: html = f.read() # 提取所有包含在括号里的全大写字母+数字的型号 cpu_models = re.findall(r'(([A-Z0-9]+))', html) # 统计频率并直接打印所有结果 counts = Counter(cpu_models) print("--- 所有的处理器出现频率如下 ---") for model, count in counts.most_common(): # .most_common() 可以按从多到少排序 print(f"型号: {model} -> 出现了 {count} 次")所以提交一下flag{MSM8937},发现就是答案。
这道题目目前还没有官方wp,解题出来的人也很少才3个,所以我也不确定我这个思路对不对绕不绕哈哈哈,后面如果有更新欢迎大家告诉我。