XCTF PUZZLE

PUZZLE

下载附件是一张图片,可以正常打开
在这里插入图片描述

但图片被分成一小片一小片的,而且随机摆放,但可以看出来,在原来的图片上写上了文件,猜测flag就应该是上面的文字。
使用gaps对图片进行拼图。
在这里插入图片描述

发现拼不出来。天空中的大字有flag、what’s、not、ing等,下面的花丛里有“{”。所以flag应该在在下的花丛里。
只好手动拼接。
用脚本将图片分割:

import os
from PIL import Image

def splitimage(src, rownum, colnum, dstpath):
    img = Image.open(src)
    w, h = img.size
    if rownum <= h and colnum <= w:
        print('Original image info: %sx%s, %s, %s' % (w, h, img.format, img.mode))
        print('开始处理图片切割, 请稍候...')

        s = os.path.split(src)
        if dstpath == '':
            dstpath = s[0]
        fn = s[1].split('.')
        basename = fn[0]
        ext = fn[-1]

        num = 0
        rowheight = h // rownum
        colwidth = w // colnum
        for r in range(rownum):
            for c in range(colnum):
                box = (c * colwidth, r * rowheight, (c + 1) * colwidth, (r + 1) * rowheight)
                img.crop(box).save(os.path.join(dstpath, basename + '_' + str(num) + '.' + ext), ext)
                num = num + 1

        print('图片切割完毕,共生成 %s 张小图片。' % num)
    else:
        print('不合法的行列切割参数!')

src = input('请输入图片文件路径:')
if os.path.isfile(src):
    dstpath = input('请输入图片输出目录(不输入路径则表示使用源图片所在目录):')
    if (dstpath == '') or os.path.exists(dstpath):
        row = int(input('请输入切割行数:'))
        col = int(input('请输入切割列数:'))
        if row > 0 and col > 0:
            splitimage(src, row, col, dstpath)
        else:
            print('无效的行列切割参数!')
    else:
        print('图片输出目录 %s 不存在!' % dstpath)
else:
print('图片文件 %s 不存在!' % src)

在这里插入图片描述

多少行和多少列,需要自己数一下。应该是25行,44列。
我们就得到了1100张小图片。
在这里插入图片描述

然后把带有黑色笔画的图片找出来,
我找出了213张:
在这里插入图片描述

再用PPT进行拼接(因为PPT有自动对齐功能):
最后拼出了flag:
在这里插入图片描述

{you_can _never_finish_the}

猜你喜欢

转载自blog.csdn.net/Crazy198410/article/details/112851881