题目
解压附件,有36个文件和一个压缩包,压缩包带密码和备注
分析
文件类型
随便打开一个不明文件,是jpg图片啊(FF D8 FF)
改一个试试,有一个小块二维码
后面的估计是是二维码碎片,脚本统一改一下
# coding=utf-8 import os #将无后缀的文件加上.jpg dir_list = os.listdir('./') #print(dir_list) for file in dir_list: if '.' not in file: # print(file) os.rename(file, file+'.jpg')
果不其然,就是二维码碎片了,一共36张
图片拼接
可以手动ps拼一下图,也就36张嘛
但是本人比较懒,不想干看起来不是很聪明的行为
于是学习了一下图片拼接的脚本
分析一下文件原始数据可以发现,最后告诉我们的序号,比如这张是第34张
思路:
- 将文件按顺序排列成一个列表 all_path
- 定义横纵图片个数,以及排列方式(横到纵)
脚本如下,虽然成功了,但不大简洁优化,欢迎大佬帮忙指点一二
# coding=utf-8 # python2 import os from PIL import Image #图片压缩后的大小 width_i = 134 height_i = 130 #每行每列显示图片数量 row_max = 6 line_max = 6 all_path = list() num = 0 pic_max = line_max * row_max #文件夹路径 dir_name = r"./" #获取文件夹下文件名的列表 dir_list = os.listdir('./') #将文件列表重新排序(按文件原始数据末尾的数字) for i in range(36,0,-1): # print(i) for file in dir_list: if '.jpg' in file: f=open(file ,'rb') n1 = f.read() n2 = n1[-2:] # print() if i > 9: if str(i) in n2: # all_path.append(os.path.join(file)) all_path.insert(0,os.path.join(file)) # print(all_path) break else: if 'd9' in n1.encode('hex')[-4:] and str(i) in n2: # print(file) all_path.insert(0,os.path.join(file)) break print(all_path) toImage = Image.new('RGBA',(width_i*line_max,height_i*row_max)) #拼接图片 for i in range(row_max): for j in range(line_max): # 每次打开图片绝对路路径列表的第一张图片 pic_fole_head = Image.open(all_path[num]) # 获取图片的尺寸 wihth,height = pic_fole_head.size # 按照指定的尺寸,给图片重新赋值,<PIL.Image.Image image mode=RGB size=200x200 at 0x127B7978> tmppic = pic_fole_head.resize((width_i, height_i)) # 计算每个图片的左上角的坐标点(0, 0),(0, 200),(0, 400),(200, 0),(200, 200)。。。。(400, 400) loc = (int(j % line_max * width_i), int(i % line_max * height_i)) print(loc) # print("第{}张图的存放位置".format(num),loc) toImage.paste(tmppic, loc) num = num + 1 if num >= len(all_path): break if num >= pic_max: break # print(toImage.size) toImage.save('merged.png')
拼接结果如下,还算整齐:
密码
flag.zip里的备注:
GNATOMJVIQZUKNJXGRCTGNRTGI3EMNZTGNBTKRJWGI2UIMRRGNBDEQZWGI3DKMSFGNCDMRJTII3TMNBQGM4TERRTGEZTOMRXGQYDGOBWGI2DCNBY
二维码扫描结果:
BASE Family Bucket ??? 85->64->85->13->16->32
意思应该是 base全家桶?85->64->85->13->16->32加密
那我们就倒过来解一下,这里13是Rot13吧,似乎没见过base13
strings:
GNATOMJVIQZUKNJXGRCTGNRTGI3EMNZTGNBTKRJWGI2UIMRRGNBDEQZWGI3DKMSFGNCDMRJTII3TMNBQGM4TERRTGEZTOMRXGQYDGOBWGI2DCNBY
base32_decode:
3A715D3E574E36326F733C5E625D213B2C62652E3D6E3B7640392F3137274038624148
base16_decode:
:q]>WN62os<^b]!;,be.=n;v@9/17'@8bAH
Rot13_decode:
:d]>JA62bf<^o]!;,or.=a;i@9/17'@8oNU
base85_decode:
PCtvdWU4VFJnQUByYy4mK1lraTA=
base64_decode:
<+oue8TRgA@rc.&+Yki0
base85_decode:
ThisIsSecret!233
解压一下,flag{Qr_Is_MeAn1nGfuL}