其他分享
首页 > 其他分享> > MISC-吹着贝斯扫二维码

MISC-吹着贝斯扫二维码

作者:互联网

题目

[安洵杯 2019]吹着贝斯扫二维码

解压附件,有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张

 

 

思路:

 

脚本如下,虽然成功了,但不大简洁优化,欢迎大佬帮忙指点一二

# 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}

 

标签:max,MISC,二维码,num,file,print,path,贝斯,os
来源: https://www.cnblogs.com/m718/p/14132769.html