正文
MISC-吹着贝斯扫二维码
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
题目
[安洵杯 2019]吹着贝斯扫二维码
解压附件,有36个文件和一个压缩包,压缩包带密码和备注
分析文件类型
随便打开一个不明文件,是jpg图片啊(FF D8 FF)
改一个试试,有一个小块二维码
后面的估计是是二维码碎片,脚本统一改一下
# coding=utf-8import 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
# python2import os
from PIL import Image#图片压缩后的大小
width_i = 134
height_i = 130#每行每列显示图片数量
row_max = 6
line_max = 6all_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}