首页 > 其他分享 >从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写

从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写

时间:2023-04-02 16:22:15浏览次数:45  
标签:文件 一帧 隐写 GIF 字节 杂项 图片

Misc 学习(四) - 隐写分析:GIF 图片隐写

在上一期,我主要讲了讲自己对于隐写分析中的 PNG 图片隐写的一些浅薄理解,这一期我们继续对隐写分析的学习,学习的是图片隐写中的 GIF 图片隐写。

顺便一提,杂项里的隐写方式很多很杂,有些时候甚至是出题者自己设计的隐写算法,我只能先写一些简单的、常见的来入门。

一. GIF 文件结构

GIF 文件结构比较复杂,用处也不大,大部分都是可看可不看。(不过文件头和文件尾还是得记一下)

一个 GIF 文件的结构可分为:

  • 文件头(File Header)
    • GIF 文件署名(Signature)
    • 版本号(Version)
  • 逻辑屏幕标识符(Logical Screen Descriptor)
  • 全局颜色列表(Global Color Table)
  • GIF 数据流(GIF Data Stream)
    • 控制标识符
    • 图象块(Image Block)
    • 其他的一些扩展块
  • 文件终结器/文件尾(Trailer)

在GIF文件格式中,所有的多字节值均以小端格式(从最后一个字节开始往前保存)存储。比如在我们看来 0A 00 ,这个值实际写作 00 0A ,也就是十进制的10。(注意:小端格式以字节为单位,也就是两个十六进制数一块颠倒)

其中文件头由 GIF 署名和版本号组成。GIF 署名用来确认一个文件是否是 GIF 格式的文件,这一部分由三个字符组成:GIF;文件版本号也是由三个字节组成,可以为 87a 或 89a。

紧跟在文件头后面的是逻辑屏幕标识符。这个块告诉解码器图片需要占用的空间。它的大小固定为7个字节,以画布宽度和画布高度(无符号整数)开始,它们各占用2个字节(不用想着修改它们,没什么意义)。

一个 GIF 文件一般包含多个。之前的图片渲染模式一般是将多个“图片”绘制到一个大的虚拟画布上,而现在一般将这些“图片”集用于实现动画。每张图片都以一个图像描述块作为开头,这个块固定为10字节。其后由一系列的输出编码构成,它们告诉解码器需要绘制在画布上的每个颜色信息,这些编码以字节码的形式组织在这个块中。

GIF 文件固定以 00 3B 作为文件尾

GIF 结构详见:https://www.jianshu.com/p/df52f1511cf8。

二. 空间轴隐写

由于 GIF 的动态特性,它由一帧帧的“图片”构成,所以每一帧的“图片”或者多帧“图片”间的结合,都成了隐藏信息的一种载体。我们可以用上古神器 Stegsolve 中的 Analyse --> Frame Browser 一帧帧的查看。

对于需要分离的 GIF 文件, 可以使用 convert 命令将其每一帧分割开来(建议新建一个文件夹把它放进去再分割,不然很乱很难收拾)。

convert A.gif A.png  	#将A.gif中每一帧提取成A-n.png
#如果没下过imagemagick,需要用 	sudo apt-get install imagemagick	安装

如果分离出来的图片需要拼接,可以使用 montage 工具,也可以使用 convert 命令。

convert [参数1] {输入文件名} [输出文件名]		#拼接
#[参数1]:+append 横向拼接 -append 纵向拼接 
#{输入文件名}:要拼接的图片,每张图片名之间用空格分隔,支持正则表达式,有先后顺序

montage {输入文件名} -tile [a*b] -geometry [a*b+0+0] -background [#+RGBA颜色] [输出文件名] 
#-tile [a*b]:a*b,类似于表格,每行每列放几张图
#-geometry [a*b+0+0]:a*b指上边网格每格多大,可以省略,按最大的算,+0+0真不清楚。
#-background [#+RGBA颜色] 背景颜色

三. 时间轴隐写

GIF 文件每一帧间的时间间隔也可以作为信息隐藏的载体,隐藏具体方式需具体分析,可以通过 identify 命令清晰的打印出每一帧的时间间隔。

identify -format "%s %T \n" 100.gif  	#格式:帧序号 间隔

例题

找了道例题:例题一 。大家可以自己先尝试一下,如果有困难再去看下面的题解。

题解

下载下来是一张 gif 图片,打开看看,发现好像不断有黑色文字闪过。把它拖进 Kali 里,用 convert 666.gif love.png 命令将其每一帧分割开来,再用 convert +append love-*.png ret.png 命令横向拼接(*是正则表达式),打开 ret.png flag就出来了,再拿QQ的截图扫描文字粘贴上去就完了。


本期就先说到这里,主要讲了讲隐写分析中的 GIF 图片隐写,写的不太好的地方还请包涵并提出您宝贵的建议,我们下期再见。

参考资料

[1] CTF-WIKI :https://ctf-wiki.org/misc/introduction/

[2] W3C 规范 :http://www.w3.org/Graphics/GIF/spec-gif89a.txt

以上内容仅供参考,水平不高,大佬见笑。


作者:CHTXRT

出处:https://www.cnblogs.com/chtxrt/

本文使用「CC BY-ND 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。

标签:文件,一帧,隐写,GIF,字节,杂项,图片
From: https://www.cnblogs.com/chtxrt/p/17280677.html

相关文章

  • CTF 萌新隐写(1)
    题目一描述喜欢用生日做密码。有一个zip文件。思路及解答生日做密码,生日格式有很多种,最简单的是纯数字,八位数字直接爆破。得到口令:19981000打开文件得出flag:flag{brute_force}题目一描述只有一个zip文件思路及解答解压后是一个word文档,打开文档发现是然后什么也没有......
  • 从0开始学杂项 第三期:隐写分析(2) PNG图片隐写
    Misc学习(三)-隐写分析:PNG图片隐写在上一期,我主要讲了讲自己对于隐写分析、信息搜集和直接附加的一些浅薄理解,这一期我们继续对隐写分析的学习,开始讲隐写分析最喜欢考的一项——图片隐写,我们首先学习的是图片隐写中最基础的PNG图片隐写。(此文并非教学,我只是在这里记下我的笔......
  • wxpython编写的GUI中显示gif图片的另一种方法
    当采用wx.adv.AnimationCtrl方法加载大尺寸gif图片出错的时候,就需要考虑用其他方式加载了;这里用到了imageio.v3和numpy配合加载gif图片。代码实例如下。注意的是,此代码并非gif加载全能的!当图片不规则还是会出现无法加载的情况(gif各帧之间大小不一,具体原因搞不懂);而且加载的gif图......
  • qs.stringify()、qs.parse()的使用
    一、qs是什么?qs是一个npm仓库所管理的包,可通过npminstallqs命令进行安装(axios自带qs,//importqsfrom'qs')importqsfrom"qs"; 二、基本用法2.1、qs.str......
  • Android 视频截取片段生成GIF
    就在昨天,依据公司需求,我当初辛辛苦苦写的视频生成GIF封面需求被砍.心痛之余,深海决定把代码分享出来,也希望要走这条路的小伙伴少走一些弯路优化建议:刚刚有小伙伴在评论......
  • 【语音隐写】基于小波变换实现音频数字水印嵌入提取附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • CTF第14天 图片隐写
    给的是bmp图片,猜测是图片隐写拖到Stegsolve.jar中查看rgb低位,发现一串由base64加密的字符串提取出来用在线网站解密即可ZmxhZ3tsNURHcUYxcFB6T2IyTFU5MTlMTWFCWVM1QjFHMDFGR......
  • 杂项 邮箱配置
    目录杂项邮箱配置阿里云邮箱qq邮箱杂项邮箱配置工作中经常遇到需要配置邮箱的情景,整理下邮箱的配置方式阿里云邮箱SMTP服务器名称smtp.mxhichina.com,或者smtp.您的......
  • ps 去除gif水印
    #1.导入gif,打开时间轴(这个挺重要),如下图所示#2.去水印(选中水印),如下图所示#3.使用快捷键shift+F5,选择快捷填充即可#4.注意事项有的无良人,竟然把添加到中间的部......
  • 图片隐写相关
    一些图片隐写相关的工具 steghide用于从jpg中提取隐藏文件steghideinfophoto。jpg分析图片,看看是否有隐藏文件steghideextract-sfphoto.jpg将隐藏文......