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

news/2024/11/24 23:32: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

在这里插入图片描述

总结

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


http://www.ppmy.cn/news/969767.html

相关文章

chatgpt赋能python:Python动态画图:提高数据可视化效果的最佳方法

Python动态画图: 提高数据可视化效果的最佳方法 引言 无论是数据分析、科学研究、教育还是商业领域,都需要可视化工具来传达数据。Python 可能是最流行的数据可视化工具之一,其扩展库matplotlib、Seaborn和Bokeh等都能提供强大的绘图能力。但是&#x…

vue js实现多维对象数据转换成一维数组并保留所有键值对;多维对象数据转换成一维数组,数组扁平化

首先创建一个递归函数flattenArray,该函数接受一个多维数组作为参数,并返回一个一维数组。在函数内部,使用Array.prototype.reduce()方法来遍历多维数组,并根据需要将每个对象的特定键值对添加到结果数组中。 以下是在Vue中将多维…

我去,竟可直接用命令行操作ChatGPT

ChatGPT 确实杀疯了,已经有 1亿 月活用户了,毕竟它真的有智能的样子。 我前些年还开发过智能客服系统,要是早点遇到 ChatGPT,估计可以省了不少事。 我想接下来有许多业务场景都会使用到它,比如教学,内容创…

科大星云诗社动态20220104

【每日一诗】 云酱好久没发现代诗了 断章 卞之琳 你站在桥上看风景, 看风景的人在楼上看你。 明月装饰了你的窗子, 你装饰了别人的梦。 全诗共四句34字,蕴含的人生哲理却相当丰富,诗人自己对诗歌的诠释是“写一刹那的意境&a…

科大星云诗社动态20210318

【每日一诗】 孤篇盖全唐春江花月夜张若虚春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明!江流宛转绕芳甸,月照花林皆似霰。空里流霜不觉飞,汀上白沙看不见。江天一色无纤尘,皎皎空中孤月轮…

听说最近ChatGPT很火?我来整个废话版ChatGPT!

文章目录 需求分析项目初始化读取语料库文件实现随机模块生成文章保存文章命令行配置参数命令行交互废话版ChatGPT网页版 废话版ChatGPT 的功能是能根据语料库的配置和用户输入的规则,随机生成一篇可长可短的文本,里面的内容语句通顺,但是废话…

几个人工智能大模型对比

对比ChatGPT, NewBing, 同义千问,文心一言 仅针对问题 如何获得一杯ΠC的水 同义千问回答: 完全逻辑不通,没有发现问题的关键,第一个回答尚且合理,第二个回答完全编造。 文心一言: 意识到了 达到ΠC的水 存…

架构师备战(一)-软考如何备考

我要备战的是系统架构设计师,那么软考有哪些可供我们选择的考试呢。 1、软考能考哪些 我们知道,软考的体系结构有很多,比如初级的程序员,中级的软件设计师,高级的系统架构师等。具体有哪些,大概有如下这些 计算机软件计算机网络计算机应用技术信息系统信息服务初级程序…