Misc - hiden
下载附件得到
内容如下
音频没看到有明显的摩斯密码,再去研究一下txt
txt内容为rot加密
ROT47解码:
得到一段标准代码
凯撒解密,偏移量是13(或者直接rot13)
代码意思如下:
1、打开名为flag.txt的文件并以二进制模式读取其内容到变量txt_data,获取txt_data的长度,并将其转换为3字节的字节串,使用小端序(little endian),然后将其添加到txt_data的开头。
2、使用wave模块打开名为test.wav的WAV文件,通过getparams()方法获取WAV文件的参数(如声道数、采样宽度等)并存储在attrib变量中,将WAV文件的所有帧读取到一个可变的字节数组wav_data中。
3、遍历txt_data中的每个字节,每个字节被插入到wav_data的对应位置,具体来说是每个原始字节的第四个位置(即索引为index * 4)。
4、创建一个新的WAV文件hiden.wav,设置新WAV文件的参数与原WAV文件相同,写入修改后的wav_data到新文件中。
接下来要做的就是反推出flag.txt,代码如下:
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'.")
DASCTF{12jkl-456m78-90n1234}
数据安全 2
下载附件得到
可以理解到,会有错误信息,需要调整信息,然后就是构造脚本
下面是一个大佬写的脚本,我的过于麻烦,需要重复调整
import re
import json
import string
DEBUG = False
PHONE_PREFIX = [
734, 735, 736, 737, 738, 739, 747, 748, 750, 751, 752, 757, 758, 759, 772,
778, 782, 783, 784, 787, 788, 795, 798, 730, 731, 732, 740, 745, 746, 755,
756, 766, 767, 771, 775, 776, 785, 786, 796, 733, 749, 753, 773, 774, 777,
780, 781, 789, 790, 791, 793, 799
]
WEIGHTS = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
fout = open('result.csv', 'w', encoding='utf-8')
fout.write('username,name,sex,birth,idcard,phone\n')
def wrong(line, reason):
if DEBUG:
fout.write(reason + ',')
line = [f'"{i}"' if ',' in i else i for i in line]
fout.write(','.join(line) + '\n')
with open('data.pcapng', 'r', encoding='latin1') as f:
data = f.read()
strings = re.findall(r'\{"username": ".*", "name": ".*", "sex": ".*", "birth": ".*", "idcard": ".*", "phone": "\d*"\}', data)
print(len(strings)) # 8000
for item in strings:
line = json.loads(item).values()
(username, name, sex, birth, idcard, phone) = line
if any(i not in string.ascii_lowercase + string.ascii_uppercase + string.digits for i in username):
wrong(line, '用户名不全为数字字母')
elif not all('\u4e00' <= char <= '\u9fff' for char in name):
wrong(line, '姓名不全为汉字')
elif len(idcard) != 18 or not all(i in string.digits for i in idcard[:17]):
wrong(line, '身份证号不为18位数字')
elif sex != ('男' if int(idcard[16]) % 2 == 1 else '女'):
wrong(line, '性别与身份证号不符')
elif birth != idcard[6:14]:
wrong(line, '生日与身份证号不符')
elif len(phone) != 11 \
or not all(i in string.digits for i in phone) \
or int(phone[:3]) not in PHONE_PREFIX:
wrong(line, '手机号不为符合前缀的11位数字')
elif '10X98765432'[sum(int(idcard[i]) * WEIGHTS[i] for i in range(17)) % 11] != idcard[17]:
wrong(line, '身份证号校验位错误')
fout.close()
大佬wp:羊城杯 2024 初赛部分题目 Writeup by LilRan of 四象限守护者 (xinshi.fun)