CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型

2023-11-06

前言

在ctf比赛中,misc方向是必考的一个方向,其中,图片隐写也是最常见的题目类型,在本篇文章中,将教授以下内容

1.各种图片文件的头数据以及判断是什么类型的图片
2.png图片隐写
3.jpg图片隐写
4.gif图片隐写
5.bmp图片隐写
6.从图片中提取文件
7.lsb隐写
8.盲水印
9.exif隐写
10.图片宽高修改
……

题目以及本文所使用的所有工具项目地址,环境也配置好了,一键安装即可:

https://github.com/baimao-box/Misc_Picture_Steganography

在这里插入图片描述

在这里插入图片描述

安装完后,可以直接在终端输入脚本名称即可运行

在这里插入图片描述

我不喜欢一开始就在文章前面抛出一大堆生涩的原理,我个人喜欢遇到什么就讲什么,这样也方便理解,各位可以点击右边目录自动跳转到需要的部分

什么是计算机文件

文件由一大堆10101110……的二进制码组成,现代大多数电脑的操作系统中,文件是数据的容器,格式主要它的内容定义

PNG隐写

判断图片类型

我们将图片拖入winhex里,就能看见文件的十六进制码

在这里插入图片描述

文件通过特殊的格式,能让操作系统知道这是一个什么类型的文件

PNG图像格式文件由一个8字节的PNG文件标识域和3个以上的后续数据块如:IHDR、IDAT、IEND等组成

89 50 4E 47 0D 0A 1A 0A
89:用于检测传输系统是否支持8位的字符编码,用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然
50 4E 47:PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件
0D 0A:DOS风格的换行符,用于DOS-Unix数据的换行符转换
1A:在DOS命令行下,用于阻止文件显示的文件结束符
0A:Unix风格的换行符,用于Unix-DOS换行符的转换

判断文件格式

在这里插入图片描述

这是一个exe程序,我们将它拖入winhex里查看

在这里插入图片描述

可以看到,这个文件头标识为

89 50 4E 47 0D 0A 1A 0A

标准的png图片格式,我们将后缀改为png

在这里插入图片描述

扫码就能获得flag

倒转文件byte

在这里插入图片描述

这是一个后缀为jpg的图片,我们用winhex打开这个图片看看

在这里插入图片描述

在最下面,可以看到一个倒过来的PNG和IHDR标识,说明这个png的图片格式都倒过来了,我们需要写一个小脚本来让他复原

a = open('flag.jpg','rb')  #读取flag.jpg图片的byte数据
b = open('png.png','wb')  #新建一个名为png.png的图片,写入byte数据
b = b.write(a.read()[::-1])  #将flag.jpg图片的byte数据,倒着写入png.png图片里

运行脚本,就能得到flag

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加文件头数据

在这里插入图片描述

这个图片无法打开,我们拖入winhex里看看

在这里插入图片描述

文件头部只有

0D 0A 1A 0A

而png文件头部为

89 50 4E 47 0D 0A 1A 0A

我们需要写入89 50 4E 47,ctrl+n新建一个文件

在这里插入图片描述

随意设置一个大小,然后ctrl+a全选数据,然后ctrl+c复制后粘贴到新文件里

在这里插入图片描述

点击第一个值,写入89 50 4E 47

在这里插入图片描述

然后ctrl+s保存为png格式的文件

在这里插入图片描述

在这里插入图片描述

现在图片就显示正常了

图片宽高以及CRC爆破

PNG文件中,每个数据块都由四个部分组成,如下:

长度(Length):指定数据块中数据区域的长度,长度不可超过(2^31-1)个字节
数据块类型码(Chunk Type Code):数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号"
数据块数据(Chunk Data):存储数据块类型码指定的数据
循环冗余检测(CRC):存储用来检测是否文件传输有误的循环冗余码

在这里插入图片描述

图片高度修改

在这里插入图片描述

这是一个png图片,但是感觉高度不太对,我们把图片拖入winhex里

在这里插入图片描述

修改图片高度的值

在这里插入图片描述

ctrl+s保存后查看图片

在这里插入图片描述

出现了flag

图片宽度和CRC值爆破

目前手上没这种类型的题,可以去看看落雪wink师傅的文章,因为csdn不让我添加太多外链,所以手动去掉链接中的字符即可

ht去掉字符tps://blog.csdn.net/weixin_44145452/article/details/109612189

从图片中提取文件

通过cmd的copy命令,可以将文件隐藏在图片里,我们需要从图片中提取文件,这也是ctf经常考的点

在这里插入图片描述

这是一张正常的jpg图片,但是在最下面可以看到一个文件

在这里插入图片描述

说明有其他文件在这个图片里,我们需要提取出来

通过binwalk提取图片中的文件

binwalk扫描图片内是否存在其他文件

binwalk dog.jpg

在这里插入图片描述

可以看到,这个图片里有一个名为hidden_text.txt的文件,现在我们提取这个文件

binwalk -e dog.jpg --run-as=root

在这里插入图片描述

他会自动生成一个文件夹,将提取出来的文件放入这个文件夹里

通过foremost提取图片中的文件

我常用的提取工具是foremost,因为他比binwalk更精确一些

foremost dog.jpg -o dog  //-o:指定输出的文件夹

在文件夹里有一个名为audit.txt的文件,这个文件里可以查看一些图片的信息

在这里插入图片描述

在这里插入图片描述

JPG图片隐写

jpg图片格式

jpg图片的头数据为

FF D8 FF

在这里插入图片描述

jpg图片高度修改

这是一个jpg图片,但是在最下面,可以看到flag的一些信息

在这里插入图片描述

我们将图片拖入winhex里

在这里插入图片描述

我们修改高度,然后ctrl+s保存

在这里插入图片描述

在这里插入图片描述

就能看见flag了

EXIF信息

在我们拍摄图片时,exif可以记录数码照片的属性信息和拍摄数据

右击图片,点击熟悉,选择详细信息,这里面可以看到图片拍摄的一些值,有时候还能找到经纬度

在这里插入图片描述

在kali里,我们可以用exiftool工具来查看更详细的exif数据

exiftool cat.jpg

在这里插入图片描述

在这里可以看到一串base64编码,我们解密看看

在这里插入图片描述

得到flag

在做osint类题目时,需要留意图片的exif信息里有没有经纬度,在做不出来题的时候,可以看看图片的exif信息

BMP图片隐写

BMP图片格式

BMP 文件格式能够存储单色和彩色的二维数字图像,具有各种颜色深度,并且可以选择使用数据压缩、alpha 通道和颜色配置文件

bmp的头文件数据为

42 4D

在这里插入图片描述

头数据后四位是图片大小

在这里插入图片描述
由于个人计算机都是以小端序,所以数据要从右往左写

0x002c268e == 2893454(Byte) == 2.75M

在这里插入图片描述

BMP图片高度修改

在这里插入图片描述

这是一个没有后缀名的文件,我们用winhex打开这个文件

在这里插入图片描述

文件头为42 4D,这是一个bmp文件,我们将后缀名改成bmp

在这里插入图片描述

用ps打开这个图片,可以看到一个假的flag,并且高度也有些不对

这是维基百科对bmp图片结构的解释

https://en.wikipedia.org/wiki/BMP_file_format

在这里插入图片描述

在这里插入图片描述

我们将32 01 修改为 32 04,再拖进ps里就能看见flag了

在这里插入图片描述

GIF图片隐写

gif图片是动图,它是由一帧一帧的图片拼接而成

GIF图片格式

gif头文件数据为

47 49 46 38 39 61

在这里插入图片描述

GIF帧分离再拼接

在这里插入图片描述

这是一个很细的gif图片,我们需要分离它的每一帧后再拼接

convert glance.gif flag.png   #一帧一帧分割图片

在这里插入图片描述

分离出了很多图片,现在我们要把他们拼成一张图片

montage flag*.png -tile x1 -geometry +0+0 flag.png     #合并图片

在这里插入图片描述

得到flag

GIF图像格式和特征

有些GIF图片每一帧都可能存在规律,这也是常考的点

在这里插入图片描述

发现打不开这个gif图片,我们把它拖到winhex里看看

在这里插入图片描述

发现文件头数据不见了,我们ctrl+n新建一个文档,然后输入gif的头数据

47 49 46 38 39 61

在这里插入图片描述

回到第一个图片数据,ctrl+a全选,然后复制粘贴到新文件里

在这里插入图片描述

ctrl+s保存

在这里插入图片描述

在这里插入图片描述

现在就能正常读取gif图片了,但是并没有显示flag,而且图片也不是动图,我们猜测它的每一帧都有规律

现在用identify工具来识别规律

identify -format "%T" flag.gif

在这里插入图片描述

我们将这些值复制出来,新建一个文本文档,将开头的四个6删除过,ctrl+h替换数字

在这里插入图片描述

将10全部替换为1,将20全部替换为0

在这里插入图片描述

把这些二进制值复制下来,去这个网站对应位置粘贴上去

https://www.rapidtables.com/convert/number/ascii-hex-bin-dec-converter.html

在这里插入图片描述

得到flag

GIF每一帧查看

如果想查看gif图片的每一帧,则可以使用Stegsolve工具

在这里插入图片描述

选择要查看的图片导入

在这里插入图片描述

选择frame browser即可查看每一帧

或者用pr也行

盲水印

盲水印是一种肉眼不可见的水印方式,可以保持图片美观的同时,保护版权,隐藏式的水印是以数字数据的方式加入音频、图片或影片中,但在一般的状况下无法被看见

这里就用官方图片做演示

在这里插入图片描述

这里有两张一模一样的图片,现在我们查看水印

bwm decode hui.png hui_with_wm.png flag.png

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LSB隐写

lsb隐写题在ctf中也经常考到,LSB即为最低有效位,我们知道,图片中的图像像素一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色。而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种。

在这里插入图片描述

LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,每个像数可以携带3比特的信息。

在这里插入图片描述

上图我们可以看到,十进制的235表示的是绿色,我们修改了在二进制中的最低位,但是颜色看起来依旧没有变化。我们就可以修改最低位中的信息,实现信息的隐写

这里就需要用到Stegsolve工具了

在这里插入图片描述

这是一个正常的png图片,但是用binwalk工具发现了这个图片里还隐藏了一张图片

binwalk final.png 

在这里插入图片描述

我们用foremost工具提取图片

foremost final.png -o flag

在这里插入图片描述

提取出来的图片名叫00003745.png

在这里插入图片描述

然后用Stegsolve打开这个图片

在这里插入图片描述

在这里插入图片描述

选择data extract

在这里插入图片描述

设置red位和lsb模式后,点击preview

在这里插入图片描述

往上查看就能看见flag

在这里插入图片描述

有些题需要一个一个试,或者使用一开始的图标查看图片有没有什么特殊的变化,然后对应左上角的模式去data extract里查看

在这里插入图片描述

提取图像中的隐藏数据

有些题目是利用LSB的特性来往里面隐藏一些字符串

在这里插入图片描述

这是一张正常的png图片,我们把它拖入winhex里查看

在这里插入图片描述

在最下面发现了隐藏的图片和一串字符串7his_1s_p4s5w0rd,猜测是lsb隐写解密的key值

现在使用foremost提取图片

foremost FindHideMsg.png -o test

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

图片提示我们是lsb隐写,现在我们就需要用到刚刚的key值去解密信息

lsb extract secret.png flag.txt  7his_1s_p4s5w0rd
//extract:提取,后面为需要提取信息的图片和输出的文件名,以及key值

在这里插入图片描述

查看文件里的字符串

有些题目往图片里添加一些字符串,列如上一道题目,我们可以使用strings工具来查看文件里的字符串

在这里插入图片描述

这是一张正常的jpg图片,现在我们提取文件里的字符串

strings hex.jpg

在这里插入图片描述

总结

很多题目都是考了不同或者多方向的知识点,总之,学得越多越好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型 的相关文章

随机推荐

  • 从今天起,不再为 API 烦恼 !

    做技术管理的童鞋 往往会陷入这样一种困境 疲于奔命 到处救火填坑 沟通推进 却挤不出时间思考对团队和项目来说真正重要的事情 你有没有经历过这样的场景 1 下属老是改了接口但不维护文档 屡说不改 2 后端改了接口没有及时通知前端和测试 导致下
  • C++ 创建共享内存

    共享内存用于实现进程间大量的数据传输 共享内存是在内存中单独开辟一段内存空间 这段内存空间有自己特有的数据结构 包括访问权限 大小和最近访问时间等 1 shmget函数 include
  • 【Postman】接口测试&压力测试

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 它提供功能强大的 Web API HTTP 请求调试 1 环境变量和全局变量设置 环境变量可以使用在以下地方 URL URL params Header val
  • SQL驱动下载并导入idea,idea连接数据库

    虽然是件小事 但花费了我一个小时呜呜呜呜呜 所以写个博客 希望能帮到需要的人 首先 做好准备工作 1 下载database插件 1 点击上边栏中的设置 gt 选中plogins 2 在搜索框搜索database gt 选择Database
  • 字节跳动Java面试还要问网络知识?懂一点就好

    作者简介 CSDN2021博客之星亚军 新星计划导师 博客专家 哪吒多年工作总结 Java学习路线总结 搬砖工逆袭Java架构师 关注公众号 哪吒编程 回复1024 获取Java学习路线思维导图 大厂面试真题 加入万粉计划交流群 一起学习进
  • emacs快速启动--emacsclient

    emacs快速启动的目标 emacs因为插件太多 启动速度慢 使用emacsclient 实现快速启动emacs emacs的buffer管理特别方便 特别是spacemacs 打开的文件 最好不要释放 虽然占用内存 但是现在的电脑已经不在
  • spring 序列化是什么意思_从LocalDateTime序列化探讨全局一致性序列化

    楔子 今天要写的是这篇 从LocalDateTime序列化来看全局一致性序列化体验 这个标题看起来蛮不像人话的 有种挺官方的感觉 我先给大家翻译翻译我们的主题是什么 通过讲解LocalDateTime的序列化从而引出整个项目中的所有序列化处
  • 数据结构——线性结构(线性表)

    文章目录 一 线性结构概述 1 线性结构 线性表的逻辑结构 的定义 2 线性表的特点 二 线性结构分类 1 连续存储 顺序表 1 什么叫数组 2 顺序表算法的基本操作 3 顺序表 物理结构 2 离散存储 链表 1 定义 1 专业术语 2 确
  • 【转载】OpenCV-Python系列之轮廓入门(二十七)

    本次我们将讨论OpenCV中的轮廓 轮廓属于OpenCV中的一个很重要的部分 同时我们在之前讲过的Canny边缘检测将作为基础 轮廓检测 函数原型 cv2 findContours image mode method contours No
  • Postgresql 行变列 crosstab交叉函数 报错及解决;No function matches the given name and arguments.

    Postgresql行变列 使用crosstab 需要安装拓展 extension 1 报错 2 解决 安装扩展 CREATE EXTENSION tablefunc WITH SCHEMA lt
  • 区块链技术原理、发展历史根由、应用场景

    记账技术历史悠久 现代复式记账系统 Double Entry Bookkeeping 是由意大利数学家卢卡 帕西奥利 1494年在 Summa de arithmetica geometrica proportioni et proport
  • 区块链理论入门(自用,待补充)

    基于北大肖臻老师课程的简单笔记 北京大学肖臻老师 区块链技术与应用 公开课 哔哩哔哩 bilibili 区块链 一 比特币 交易过程公开 1 密码学原理 1 哈希函数 crytogrphic hash function 哈希碰撞 colli
  • [架构之路-179]-《软考-系统分析师》-19- 系统可靠性分析与设计 -1- 故障模型、可靠性模型、可靠性分析

    目录 前言 1 9 1 系统可靠性概述 19 1 1 系统故障模型 1 在信息系统中 故障或错误有如下儿种表现形式 2 故障的缘由 3 故障模型 1 逻辑电路级的故障 2 数据结构级的故障 3 软件逻辑代码 语句故障和软件差错 4 系统级的
  • 批处理中setlocal enabledelayedexpansion的作用详细整理

    设置本地为延迟扩展 其实也就是 延迟变量 全称延迟环境变量扩展 想进阶 变量延迟是必过的一关 所以这一部分希望你能认真看 为了更好的说明问题 我们先引入一个例子 例1 复制代码代码如下 echo off set a 4 set a 5 ec
  • springboot中使用logback打印mybatis的sql日志

    springboot中使用logback打印mybatis的sql日志 文章目录 springboot中使用logback打印mybatis的sql日志 前言 我的配置 开始配置 1 在application yml里面添加logback
  • Sublime text3 整理代码格式 (亲测有效)

    技巧 Sublime text3 整理代码格式 2017 05 25 10 06 48 转载 标签 sublime 自动整理代码格式 编辑器 it 快捷键 分类 Sublime 之前有使用过HBuilder编译器 也听使用别的编译器的朋友提
  • 消息中间件RabbitMQ和Kafka区别

    RabbitMQ Kafka
  • 推荐一个前端必备工具,有了它开发效率提升200%,堪称神器

    拒绝重复工作 前端页面的构建与调试 是每一个前端人都绕不过去的基本功 但是页面的构建与UI的还原工作往往是重复且繁杂的 在日常的开发工作中会占用我们大量的时间和精力 慢慢的 随着我们每个人技术水平的不断提升 页面的构建工作就会成为我们技术水
  • Nginx高级配置

    目录 一 Nginx 第三方模块 1 1ehco 模块 二 变量 2 1 内置 2 2 自定义变量 三 nginx压缩功能 编辑四 https功能 一 Nginx 第三方模块 1 1ehco 模块 基于nginx 模块 ngx http s
  • CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型

    前言 在ctf比赛中 misc方向是必考的一个方向 其中 图片隐写也是最常见的题目类型 在本篇文章中 将教授以下内容 1 各种图片文件的头数据以及判断是什么类型的图片 2 png图片隐写 3 jpg图片隐写 4 gif图片隐写 5 bmp图