翻译学习自 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}