Maps
- 关注

了解GIF文件的格式
GIF文件格式
GIF图像文件以数据块(block)为单位来存储图像的相关信息。一个GIF文件由表示图形/图像的数据块、数据子块以及显示图形/图像的控制信息块组成,称为GIF数据流(Data Stream)。数据流中的所有控制信息块和数据块都必须在文件头(Header)和文件结束块(Trailer)之间。
GIF文件格式采用了LZW(Lempe-ZivWalch)压缩算法来存储图像数据,定义了允许用户为图像设置背景的透明(transparency)属性。此外GIF文件格式可在一个文件中存放多幅彩色图形/图像。如果在GIF文件中存放有多幅图,它们可以像演幻灯片那样显示或者像动画那样演示。
GIF文件内部是按块划分的,包括控制块 (Control Block) 和数块Data Sub-blocks) 两种。控制块是控制数据块行为的,根据不同的控制块包含一些不同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据块大小(字节数》,计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的大小0x00。下表是一个数据块的结构:
文件头部分(Header)
GIF署名(Signature)和版本号(Version)
GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:”GIF”;文件版本号也是由三个字节组成,可以为”87a"或”89a”具体描述见下表:
GIF数据流部分(GIF Data Stream)
逻辑屏幕标识符(Logical Screen Descriptor)
这一部分由7个字节组成,定义了GIF图象的大小Logical Screen Width & Height)、颜色深度(Color Bits)、背景色(Blackground ColorIndex)以及有无全局颜色列表(Global Color Table)和颜色列表的索引数(ndex Count),具体描述见下表:
m- 全局颜色列表标志(Global Color Table Flag),当置位时表示有全局颜色列表,pixel值有意义
cr - 颜色深度(Color ResoluTion),cr+1确定图象的颜色深度
s- 分类标志(Sort Flag),如果置位表示全局颜色列表分类排列.
pixel- 全局颜色列表大小,pixel+1确定颜色列表的索引数(2的pixel+1次方)
全局颜色列表(Global Color Table)
全局颜色列表必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,按R、G、B的顺序排列。
图形控制扩展(Graphic Control Extension)
这一部分是可选的(需要89a版本),可以放在一个图象块(图象标识)或文本扩展块的前面,用来控制在它后面的第一个图象(或文本)的渲染(Render)形式,组成结构如下。
处置方法(Disposal Method)指出处置图形的方法
0-不使用处置方法
2- 回复到背景色
1- 不处置图形,把图形从当前位置移去
3- 回复到先前状态
文件结尾部分
文件终结器(Trailer)
这一部分只有一个值为0的字节,标识一个GIF文件结束
常见隐写方式
GIF文件隐写题目主要有以下几类考点:
- 修补文件头部
- 空间轴隐藏信息
- 时间轴隐藏信息
修补文件头部
CTF中有的时候会需要我们去修复图片,这对我们对于图片的文件结构要有了解。找到/gi的文件格式,然后对照这个破损的文件对其进行修补
解决方式:
使用16进制编辑器修复GIF文件头部,然后保存
空间隐藏信息
由于 GIF 的动态特性,由一顿的图片构成,所以每一锁的图片,多赖图片间的结合,都成了隐藏信息的一种载体,
解决方式
- 使用StegsolvefJ开图片,Stegsolve Analyse-Frame Brower进行分帧
- 可以使用conwert命令gif图片的每一赣分割开来
- convert persistant.gif transparent white result.gif
时间轴隐藏信息
GIF文件每一间的时间间隔也可以作为信息隐藏的载体
解决方法:
通过工具或者脚本获取gif图每一顿的时间间隔
通过identify命令清晰的打打印出每一顿的时间间隔 identify -format"%Tn”100.gif根据时间间隔的规律解决题目
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)