从0开始学杂项 第四期:隐写分析(3) 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」创作共享协议,转载请在文章明显位置注明作者及出处。
从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写的更多相关文章
- 从0开始学杂项 第三期:隐写分析(2) PNG图片隐写
Misc 学习(三) - 隐写分析:PNG 图片隐写 在上一期,我主要讲了讲自己对于隐写分析.信息搜集和直接附加的一些浅薄理解,这一期我们继续对隐写分析的学习,开始讲隐写分析最喜欢考的一项--图片隐写 ...
- 从0系统学Android--3.2四种基本布局
从0系统学Android--3.2四种基本布局 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.3 系统控件不够用?创建自定义控件 上一节我们学习了 Android 中的一些常用的控件 ...
- 从0开始学Java 第一期 开发前的准备
Java 学习(一) - 开发前的准备 前言 由于一些项目上的需要,我得学习一下 Java 这门语言(主要是想写Android),本人并非0基础,至少在上个学期学习了一门必修的程序设计(C语言),所以 ...
- 精通Web Analytics 2.0 (6) 第四章:点击流分析的奇妙世界:实际的解决方案
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第四章:点击流分析的奇妙世界:实际的解决方案 到开始实际工作的时候了.哦耶! 在本章中,您将了解到一些最重要的网络分析报告,我将 ...
- [老老实实学WCF] 第四篇 初探通信--ChannelFactory
老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了. ...
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
- HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
简单数学题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 从0系统学Android--4.1探究碎片
从0系统学Android--4.1探究碎片 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 第四章:手机平板要兼顾--探究碎片 平板电脑和手机最 ...
随机推荐
- 什么是数据同步利器DataX,如何使用?
转载至我的博客 https://www.infrastack.cn ,公众号:架构成长指南 今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎,官网 ...
- python selenium list index out of range
常见错误原因 常见错误原因 其他错误原因 场景 使用selenium循环打开并跳转到新的网页,然后关闭新的窗口,然后回到原来窗口,这时候获取list中的值,报错: list index out of ...
- 【LeetCode二叉树#16】二叉(搜索)树的最近公共祖先(递归后序遍历,巩固回溯机制)
二叉树的最近公共祖先 力扣题目链接(opens new window) 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 ...
- fatal: bad object refs/remotes/origin/xxx
解决方案: 1.项目的.git文件内的目录.git/logs/refs/remotes/origin/,删除该错误的本地远程分支: 2.执行git pull --rebase即可 类似错误信息例子: ...
- 【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
问题描述 在昨天的文章中,创建了 Disk + PV + PVC + POD 方案(https://www.cnblogs.com/lulight/p/17604441.html),那么如何进入到PO ...
- 代码随想录算法训练营第二十七天| 39. 组合总和 40.组合总和II 131.分割回文串
39. 组合总和 卡哥建议:本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制 题目链接/文章讲解:https://programmercarl.com ...
- rpa使用自带数据抓取方式抓取页面元素
大家好,我是一方. 今天我们一起看一下如何使用rpa自带的功能来抓取自己想要的页面元素,这里我们以抖音为例来抓取某个领域的作者列表. 想要获取页面元素,大概的流程为:确定页面元素.分析页面元素.使用自 ...
- Java 类方法的声明和使用
1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...
- 开源的 Sora 复现方案,成本降低近一半!
近日,开发 ChatGPT 的 OpenAI 公司又放出王炸 Sora,一个可以根据文本生成视频的 AI 模型. 上图就是 OpenAI 公布的 Sora 生成的视频片段,可以毫不夸张地说 Sora ...
- Kubernetes-一文详解ServiceAccount与RBAC权限控制
一.ServiceAccount 1.ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) ...