首先将 rar 文件下载到本地,解压得到 2.png,在 Windows 下却可以正常浏览。
而在 Linux 下打不开,提示信息给的很足:文件头数据块(IHDR)损坏了。
在Linux下用 file 命令查看文件格式(后缀名不一定正确),确实是 PNG 格式文件。
file 2.png :
其实这就是通过查看图片的16进制头文件来决定的:
pngcheck是一个简单易用的应用程序,旨在验证PNG,JNG和MNG文件的完整性。通过分析内部32位校验和并解压缩图像数据来完成检查。windows和linux都有相应的版本,pngcheck官网:https://www.softpedia.com/get/Multimedia/Graphic/Graphic-Others/pngcheck.shtml。在windows下用 pngcheck 检查一下2.png,得到以下信息:
pngcheck.exe 2.png
发现是图片的crc校验码有问题。
PNG 文件头数据块知识补充
(固定)八个字节 89 50 4E 47 0D 0A 1A 0A 为 PNG 的文件头,说明这是一个 PNG 文件
(固定)四个字节00 00 00 0D(即为十进制的 13)代表数据块的长度为 13
(固定)四个字节49 48 44 52(即为 ASCII 码的 IHDR)是文件头数据块的标示(IDCH)
(可变)13 位数据块(IHDR)
前四个字节代表该图片的宽
后四个字节代表该图片的高
后五个字节依次为:Bit depth、ColorType、Compression method、Filter method、Interlace method
(可变)剩余四字节为该 PNG 的 CRC 检验码,由从 IDCH 到 IHDR 的十七位字节进行 CRC 计算得到。
需要通过在十六进制编辑器中修改宽和高的值,达到修复 CRC Error 的效果。
我们规定 crc32key 为该 PNG 文件的 CRC 验证码,它是由从 IDCH 到 IHDR 的十七位字节进行 CRC 计算得到的。不妨写一个 Python 脚本,进行上述计算得到的结果记为 crc32result,如果
crc32result == crc32key
则表明此时的长宽比符合题意,图片修复完毕。具体思路见:https://www.jianshu.com/p/0b5d14657d2e 。CRC 函数(crc32)导入 zlib 库可以得到。
计算正确的crc32校验码:
修改图片的16进制文件:
再打开2.png:
得到flag为:BUGKU{a1e5aSA}