小菜鸡第一次当出题人,很新奇的经历,出题过程很折磨,但在出题过程中也学到很多。这道题第一天直到晚上24:00还是1解,一直盯着大屏真的很慌很慌啊啊啊啊,所幸最后还有14解,出题的思路以及解题过程如下,还有很多不足需要慢慢改进,向各位师傅看齐!
程序猿Quby的解题思路
题目信息
题目名 | 类型 | 难度 |
---|---|---|
程序猿Quby | MISC | 中等 |
知识点
-
夏多密码
-
加密lsb隐写
-
二值矩阵转图片(黑白像素点处理)
-
deepsound音频隐写
-
base全家桶解码(base64变表)
解题步骤
-
首先拿到题目Qubyquby.png
对图片进行分析,首先,发现有rar压缩包,于是采用binwalk进行分离
压缩包被加密,于是开始寻找密码。
结合题目提示:《死亡之链》;“手表”;“分针秒针坏了”;”齿轮转动“可以联想出是夏多加密
将时间按序号归类,发现每个序号下时间数目为1、2、3、4不均,类似夏多密码表的规律
由于题目提示秒针和分针都坏了,所以只关注时针即可,画出时针之后并分别合成一个时钟可以得到:
按照顺序依次排开:
对照夏多密码表
解得密码:
HAVEANICEDAY
但是测试后发现并不是压缩包的密码,所以这个密码另有用处
根据已知有密码的隐写,猜测可能是加密lsb
所以用cloacked-pixel分析图片,并提取出文件out
we1c0met0ycbCTF!!!
打开压缩包
得到两个excel表格和一个音频文件
根据提示
excel文件中应该是音频加密的密码。
首先第一个文件:
调整字体颜色可以发现有一个二值矩阵,同理,第二个也有:
两个矩阵大小相同,再根据“OK”的提示猜测要将矩阵合并
因为只有两个数字在不断重复出现,所以尝试布尔数,
将5.53改为1 4.46改为0(另一个矩阵同理)
并提取出这个01二值矩阵得到1.txt,同理第二个文件得到2.txt
写个脚本合并两矩阵
def merge_matrices(submatrix1_file, submatrix2_file, merged_file): # 读取子矩阵文件1 with open(submatrix1_file, 'r') as f1: submatrix1_lines = f1.readlines() # 读取子矩阵文件2 with open(submatrix2_file, 'r') as f2: submatrix2_lines = f2.readlines() # 获取子矩阵行数和列数 rows = len(submatrix1_lines) cols = len(submatrix1_lines[0].strip()) + len(submatrix2_lines[0].strip()) # 检查子矩阵尺寸是否符合要求 if cols != 126: print("错误:子矩阵尺寸不正确。") return # 合并子矩阵 merged_matrix = [] for i in range(rows): combined_row = submatrix1_lines[i].strip() + submatrix2_lines[i].strip() merged_matrix.append(combined_row) # 将合并后的矩阵写入新文件 with open(merged_file, 'w') as f: for row in merged_matrix: f.write(row + '\n') print("合并完成。") # 调用函数并传入文件名 merge_matrices('test1.txt', 'test2.txt', 'merged_matrix.txt')
尝试写脚本转为黑白像素点构成图片可以得到:
import numpy as np from PIL import Image def restore_image_from_file(file_path): with open(file_path, "r") as file: lines = file.readlines() binary_matrix = [] for line in lines: row = [int(value) for value in line.strip()] binary_matrix.append(row) height = len(binary_matrix) width = len(binary_matrix[0]) image = Image.new("L", (width, height)) pixels = image.load() for y in range(height): for x in range(width): if binary_matrix[y][x] == 0: # 白色像素 pixels[x, y] = 255 else: # 黑色像素 pixels[x, y] = 0 return image # 使用示例 file_path = "3.txt" # 二值化矩阵文件路径 restored_image = restore_image_from_file(file_path) restored_image.show()
运行脚本
得到密码:
w0wyoudo4goodj0b
尝试deepsound隐写提取出压缩包得到Family_bucket.zip:
两个文件,fl4g.txt有两层编码,base85——>base32全家桶,解密得到
sQ+3ja02RchXLUFmNSZoYPlr8e/HVqxwfWtd7pnTADK15Evi9kGOMgbuIzyB64CJ
最后一层是base64,只不过换了表
将刚刚解出的字符串作为新表替换,将flag.txt中内容作为密文得到
flag:
DASCTF{Qu6y_d0_not_lik3_w0rking_4t_all}
-
wireshark提取文件,学长出了一道交响曲的题目,做了做正好还回顾了一下怎么从wireshark提取文件,之前都是手提好麻烦好麻烦啊啊啊步骤:文件——>导出对象——>选择流
直接提取就可以了
upload.php里面还有一张png,那个可能就要放到010editor里面然后保留png文件头和文件尾中间部分手动提取啦
bv号是bilibili的视频号:直接在b站搜索框搜就可以啦
HINT:BV1wW4y1R7Jv&&FLAG1:@i_n1a_l0v3S_
qubyquby~拜拜咯