Maps
- 关注

使用的工具:
PCRT
https://github.com/sherlly/PCRT
BlindWaterMark
https://github.com/chishaxie/BlindWaterMark
Macromedia Fireworks 8
BCompare
1.PNG的文件格式
PNG是一种无损压缩的位图片形格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG fle signature) 域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG定义了两种类型的数据块,一种是称为关键数据块(ritical chunk),这是必需的数据块另一种叫做辅助数据块(ancilarychunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。
PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成
CRC循环几余码生成的计算方式是通过对Chunk Type Code和Chunk Data中的数据进行计算得到的,计算方式如下
CRC-32=X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1
IHDR
文件头数据块HDR(Header Chunk): 它包含有 PNG 文件中存储的图像数据的基本信息,由 13 字节组成,并要作为第一个数据块出现在PNG 数据流中,而且一个 PNG 数据流中只能有一个文件头数据块
其中我们需要了解的是前 8字节的内容,其中我们主要关注图片的宽和高,出题人经常会去更改一张图片的高度或者宽度使得一张图片显示不完整从而达到隐藏信息的目的。
PLTE
调色板数据块 PLTE(palette chunk): 它包含有与索引彩色图像indexed-color image) 相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块 (image data hunk)之前。真彩色的 PNG 数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
一个PNG文件只能有一个调色板数据块,调色板数据块从下标0开始。
IDAT
图像数据块IDAT(image data chunk): 它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。特点如下:
- 储存图像像数数据
- 在数据流中可包含多个连续顺序的图像数据块
- 采用 LZ77 算法的派生算法进行压缩
- 可以用 zlib 解压缩
值得注意的是,IDAT 块只有当上一个块充满时,才会继续一个新的块
IEND
PNG的图像结束数据(IEND)用来标记PNG文件结束,并且必须要放在文件的尾部。一般情况下,所有PNG图像结束数据(END)的十六进制数值都是一样的,具体的数值如下:
00 00 00 00 49 45 4E 44 AE 42 60 82
IEND 数据块的长度总是 00 00 00 00,数据标识总是END 49 45 4E 44,因此,CRC码也总是AE 42 60 82出题人可能修改该结构,导致文件无法正常打开。
2.PNG图片隐写的常见题目类型
PNG文件隐写题目主要有以下几类:
- 字符附加和文件结合
- 基于PNG文件格式的隐写
- 基于LSB的图片隐写
- 图片容差隐写
- 图层叠加
- 数字水印隐写
字符附加和文件结合
给前面讲解的ipg格式隐写一样,png图片也可以使用字符附加和文件结合的方式,关于这种图片隐写的大概有两种经典方式,是直接附加字符串,二是图种的形式出现。
解决方法
用16进制编辑器打开图片,查找和flag有关的字符,出现在文件末尾的可能性更大在linux下,使用strings命令,可以将文件中的所有字符电打印出来,strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。使用binwalk或者foremost来分离文件
基于PNG文件格式的隐写
在CTF中,经常通过改变宽和高使得图片显示不完整或者无法显示从而达到隐藏信息的目的。对于这种情况,我们不能轻易修改图片的宽或高的值,应该通过CRC的值推算出宽或高的值;或者是修改宽或高的值后,使用CRC计算工具,计算得出新的CRC值替换原本的值,以防图片报错打不开。
除了修改宽高以外,IDAT 块也可以末尾的块内隐藏信息,并且不会影响图片的正常显示
解决方法:
- 由于CRC值计算的是数据块类型码及数据块数据,因此可以通过以下脚本计算出图片的原始宽和高
- 使用Stegsolve检查IDAT块是否正常排列
基于LSB的图片隐写
LSB 全称Least Significant t,最低有效位。PNG 文件中的图像像数一般是由 RGB 三原色(红绿蓝)组成,每一种颜色占用 8位,取值范围为 0x00 至 OxFF,即有 256 种颜色,一共包含了 256 的3 次方的颜色,即 1677721 种颜色。而人类的睛可以区分约 1000 万种不同的颜色,意味着人类的眼睛无法区分余下的颜色大约有6777216 种。
LSB 隐写就是修改 RGB 颜色分量的最低二进制位LSB),每个颜色会有 8 bit,LSB 隐写就是修改了像数中的最低的 1 bit,而人类的眼睛不会注意到这前后的变化,每个像素可以携带3 比特的信息
解决方式:
- 用Stegsolve打开图片,并在不同的通道中切换,查看图片的变化。
- 如果信息隐藏在 RGB 三个通道的最低位中,借助 Stegsolve-->Anayse-->Data Extract 可以指定通道进行提取
图片容差隐写
容差,在选取颜色时所设置的选取范围,容差越大,选取的范围也越大,其数值是在0-255之间。有时候题目有两张或多张图片,就可以考虑有可能是图片容差隐写或者盲水印等隐写方式。
解决方法
- 使用beyondcompare,bc是一款很适合用来对图片进行比较的工具,就图片而言,它支持容差、范围、混合等模式。
- 使用Photoshop,对图片进行重合,并降低对比度。这个操作对没有ps基础的同学可能有难度,但是ps功能强大,如果掌握,可以轻松秒杀般的图片隐写类题目
图层叠加
图像由图图叠加而成,图层由像素组成,每一张图层可以理解为一层透明的“玻璃”,它们各自包含独立的内容,可以理解为将各个图层从上到下依次重叠,然后俯视观测第一张图层,各个图层显示的叠加效果为图像最后的显示效果。
解决方法
使用Photoshop对图像进行处理
数字水印隐写
数字水印(digital watermark)技术,是指在数字化的数据内容中嵌入不明显的记号,特征是被嵌入的记号通常是不可见或不可观察的,但是可以通过计算操作检测或者提取。在CTF中一般以基于傅里叶变换的盲水印隐写作为考点。
解决方法
使用github上现成的项目 https://github.com/chishaxie/BlindWaterMark
使用方法:python bwmpy decode 原图png 添加水印图png 水印图png
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)