{DARK CTF }Misc/QuickFix

翻译学习自 https://github.com/apoirrier/CTFs-writeups/blob/master/DarkCTF2020/Misc/QuickFix.md

题目:Magic is in the air! Want a byte of it? 

下载得到一个超大压缩包,里面有10000张jpg图片,都无法打开

 这是其中一部分图片的样式

从题目描述中得到一个关键词magic number       //百度百科https://baike.baidu.com/item/magic%20number/6759327?fr=aladdin

它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。

从题目描述中我们可以猜想

文件的幻数可能是错误的

 strings第一张图片,发现关键字     //strings命令简介https://blog.csdn.net/stpeace/article/details/46641069    strings命令即打印文件中可打印的字符   

IHDR 

IDAT

IEND

判断这可能是个png类型              //PNG,JPEG,BMP,JIF图片格式详解及其对比   https://www.cnblogs.com/lzhu/archive/2004/01/13/8014703.html

用Hexed.it打开文件//https://hexed.it/

我们可以了解到png的文件头格式中               //PNG文件头格式解析https://blog.csdn.net/u013943420/article/details/76855416

89 50 4E 47 0D 0A 1A 0A 是PNG头部署名域,表示这是一个PNG图片
00 00 00 0D 描述IHDR头部的大小
49 48 44 52 是Chunk Type Code / magic number

因此我们把开头的10个字节替换为PNG标头的8个字节

修改后导出得到一个小小的黑块

可以推测我们需要将10000个文件全部修复然后拼起来得到一个完整的图像

python脚本

1.实现自动化修复

def modify_file(filename):
    with open(filename, "rb") as f:
        with open(filename.replace("jpg", "png"), "wb") as g:
            image = f.read()
            
            image2 = bytes.fromhex("89504E470D0A1A0A")
            g.write(image2 + image[10:])

打开损坏的文件,然后在另一个文件上将PNG标头的幻数和图像的其余部分连接

2.图像组合

import numpy as np
from PIL import Image

data = np.zeros((2000,2000,4), dtype=np.uint8)

for i in range(100):
    for j in range(100):
        #modify_file("flag_{}_{}.jpg".format(i,j))
        im = Image.open("flag_{}_{}.png".format(i,j))
        array = np.array(im.getdata()).reshape(20,20,4)
        data[20*i:20*(i+1), 20*j:20*(j+1)] = array

img = Image.fromarray(data, 'RGBA')
img.save('flag.png')

得到了完整的图像,通过旋转与对称我们可以得到flag:darkCTF{mag1c_byt3s}

原文地址:https://www.cnblogs.com/FrozenW/p/13783452.html