下载附件,里面是2个txt文件,打开flag.txt
里面是解题的提示,暂时不知道是什么意思,再打开cipher_text.txt
里面是很长一段密文,看见开头是504Q0304,非常接近zip文件的开头,再看提示,如果按照listA里“Q”对应“B”进行替换,那么就可以还原出504B0304
密文再往后看,第二个字母是I,I按照listA替换就不行了,因为“W”不是16进制数,再看listB,“I”对应“F”,不确定对不对但至少是16进制数了,此时结合密钥提示,推测应该是要用ABCDE这5个表轮流依次进行替换解密,简单验证一下后面的字母替换后确实是16进制数。
找个单表替换的脚本,修改一下,创建5个字典然后轮流依次进行替换。因为16进制数只有a~f,所以只取前6个来创建字典。
dic=[
{'P':'a', 'Q':'b', 'L':'c', 'N':'d', 'E':'e', 'Y':'f'},
{'H':'a', 'R':'b', 'V':'c', 'K':'d', 'E':'e', 'I':'f'},
{'S':'a', 'N':'b', 'U':'c', 'K':'d', 'R':'e', 'T':'f'},
{'J':'a', 'T':'b', 'K':'c', 'Q':'d', 'V':'e', 'F':'f'},
{'J':'a', 'Z':'b', 'B':'c', 'L':'d', 'E':'e', 'P':'f'}
]
def replace_decrypt(ciphertext, dictionary):
plaintext = ""
i = 0
j = 0
while i < len(ciphertext):
found_match = False
for key in dictionary[j].keys():
if ciphertext[i:i+len(key)] == key:
plaintext += dictionary[j][key]
i += len(key)
j += 1
if j == 5:
j = 0
found_match = True
break
if not found_match:
plaintext += ciphertext[i]
i += 1
return plaintext
with open('cipher_text.txt', 'r') as file:
ciphertext = file.read()
plaintext = replace_decrypt(ciphertext, dic)
with open('result.txt', 'w') as file:
file.write(plaintext)
运行脚本得到结果
用010editor另存为zip文件
zip文件是加密的,里面有6个txt文件,观察到几个password文本的大小都只有6个字节,应该是使用crc32碰撞,网上可以找到现场的工具或脚本,这里使用的是crc32-master
由于碰撞出来的结果并不能找到明显的可读字符,并且结果比较多,所以只好做一个密码字典,然后用ARCHPR进行字典爆破
拿到解压口令,解压文件得到flag.txt
接下来就进入了可怕的套娃地狱
flag.txt打开拉到最后,是3个等号,应该是base32加密,顺便看到左下角的600w+字符,还是找个脚本解密吧,用工具打开直接卡死了
然后是20多层的套娃,中间会用到base32、16进制转字符、base64,最后得到了
最后的F{__y_4Lyav_StAo4esm!Gue4oa}应该就是flag了,不过显然还有一层栅栏加密,解密后得到
栏数是4时得到最终flag,别忘了题目提示里flag小写,最终flag为
flag{you_a4e_ve4y_so_Sma4t!}