BJDCTF2020一叶障目

打开就是一个图片什么都没 stegsolve分析也分析不出什么东西 010也看不出什么 百度吧
这是png的CRC校验问题,图片的宽高被改了导致无法完全显示

如何判断这什么crc校验问题?
首先010打开1.png
前八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头,该段格式是固定的
PNG_CHUNK chunk[0] 这段可分为几块:
前四个字节00 00 00 0D 代表数据块长度为13 数据块包含了png的宽高等信息 格式是固定的
之后四个字节49 48 44 52 (即ASCII码的IHDR) 是文件头数据块的表示 这段也是固定格式的
之后进入十三位数据块 前八个字节 00 00 01 41 00 00 01 4C
这边前四个字节:00 00 01 41 代表图片的宽 后四个字节 00 00 01 4C代表高
这八个字节都属于十三位数据块的内容 因此数据块应再向后5个字节 即 00 00 01 41 00 00 01 4C 08 06 00 00 00 剩余四位C2 0F 1F C6 为该png的crc校验码也就是解题的关键
该段数据有IDCh以及十三位的数据块 即 49 48 44 52 00 00 01 41 00 00 01 4C 08 06 00 00 00 计算所得
大部分png中CRC检验错误的出题思路:

对一张正常的图片,通过修改其宽度或者高度隐藏信息,使计算出的CRC校验码与原图的CRC校验码不一致;windows的图片查看器会忽略错误的CRC校验码,因此会显示图片,但此时的图片已经是修改过的,所以会有显示不全或扭曲等情况,借此可以隐藏信息。而Linux下的图片查看器不会忽略错误的CRC校验码,因此用Linux打开修改过宽或高的png图片时,会出现打不开的情况
所以判断一张图是否为crc校验出错 就丢windows 和 linux 里头看看
可以通过爆破图片修改前的宽和高来匹配CRC校验码,并用正确的宽和高来修复图片
首先先爆破高度 脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#_ *_ coding:utf-8 _ *_ 

import binascii
import struct

#\x49 x48 x44 x52 x00 x00 x01 x41 x00 x00 x01 x4C x08 x06 x00 x00 x00
crc32key=0xc20f1fc6
for i in range(0,65535):
height = struct.pack('>i',i)
#CRC:c20f1fc6
data= '\x49\x48\x44\x52\x00\x00\x01\x41' + height + '\x08\x06\x00\x00\x00'
crc32result= binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print ' '.join(map(lambda c: "%02X" % ord(c),height))

这题就这样爆破出来了 高度被修改了 实则 00 00 03 4C
判断是否为crc校验码错误的方法:

windows下图片可以打开,其他系统下图片不能打开
使用010editor的template检测,这也是我16进制编辑器力推010editor的原因之一
使用诸如tweakpng,pngcheck等工具
修复png的crc检验码方法:

本文中所列的爆破出正确的宽或高,并用16进制编辑器修复
利用windows忽略crc检验码的特性,我们可以用tweakpng任意修改图片的宽和高,直至得到有用的信息,事实上,这是最快的方法