[羊城杯 2024]hiden
一顿解压之后发现有两个文件:
尝试了Rot47解密,得到一个看起来挺像一回事的解码结果:
再将得到的解码结果试试Rot13解密,成功得到正确的解码结果:
import wave
with open('flag.txt', 'rb') as f:
txt_data = f.read()
file_len = len(txt_data)
txt_data = file_len.to_bytes(3, byteorder = 'little') + txt_data
with wave.open("test.wav", "rb") as f:
attrib = f.getparams()
wav_data = bytearray( f.readframes(-1) )
for index in range(len(txt_data)):
wav_data[index * 4] = txt_data[index]
with wave.open("hiden.wav", "wb") as f:
f.setparams(attrib)
f.writeframes(wav_data)
让AI写一个python脚本反推出flag.txt文件:
import wave
# 打开含有隐藏信息的WAV文件进行读取
with wave.open("hiden.wav", "rb") as f:
# 获取音频文件参数
attrib = f.getparams()
# 读取所有帧
wav_data = bytearray(f.readframes(-1))
# 从wav_data中提取文本数据长度(前3个字节),并转换为整数
file_len = int.from_bytes(wav_data[0:3], byteorder='little')
# 提取出实际的文本数据,根据之前编码时的规则,每个字节间隔3个样本位置存储
txt_data = bytes([wav_data[index * 4] for index in range(file_len)])
# 将提取出来的数据写入到新的文本文件中
with open('extracted_flag.txt', 'wb') as f:
f.write(txt_data)
print("隐藏的文本已提取到 'extract_flag.txt' 文件中。")
但是还原的flag.txt只有部分flag,我换成chatgpt-4o mini得出的python脚本反推出来的结果还是一样:
(tip:这一题我当初是做出来了的,但是复现的时候AI不给力了)
下面是正确的python代码:
import wave
# 打开含有隐藏数据的Wave文件
with wave.open("hiden.wav", "rb") as wf:
# 获取音频文件的参数
params = wf.getparams()
# 读取音频文件的所有帧数据
wav_data = bytearray(wf.readframes(-1))
# 初始化一个空字节列表来存储提取出的文本数据
extracted_data = []
# 由于原始代码中每四个字节的第一个字节被用于存储文本文件的一个字节
# 我们只需提取这些字节即可
for index in range(0, len(wav_data), 4):
extracted_data.append(wav_data[index])
# 将提取出的字节流转换为字节对象
txt_data = bytes(extracted_data)
# 提取文件长度
file_len = int.from_bytes(txt_data[:3], byteorder='little')
# 去除文件长度标识符
txt_data = txt_data[3:]
# 根据文件长度截断数据
txt_data = txt_data[:file_len]
# 将提取出的数据写入新的文本文件
with open("recovered_flag.txt", "wb") as f:
f.write(txt_data)
print("Data extraction completed. The recovered text file is saved as 'recovered_flag.txt'.")
得到flag:
DASCTF{12jkl-456m78-90n1234}