图片隐写

图片隐写

J_R_R

2025-05-16 发布28 浏览 · 0 点赞 · 0 收藏
1.各种图片文件的头数据以及判断是什么类型的图片
2.png图片隐写
3.jpg图片隐写
4.gif图片隐写
5.bmp图片隐写
6.从图片中提取文件
7.lsb隐写
8.盲水印
9.exif隐写
10.图片宽高修改

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

PNG隐写

将图片拖入winhex里,就能看见文件的十六进制码
![[Pasted image 20250514215312.png]]Pasted image 20250514215312 - 副本.png
PNG图像格式文件由一个8字节的PNG文件标识域和3个以上的后续数据块如:IHDR、IDAT、IEND等组成
==png文件头部为:==

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换行符的转换

倒转文件byte

winhex打开这个图片
![[Pasted image 20250514220423.png]]Pasted image 20250514220423.png
在最下面,可以看到一个倒过来的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图片里
添加文件头数据

![[Pasted image 20250514220552.png]]Pasted image 20250514220552.png
图片无法打开,拖入winhex里
![[Pasted image 20250514220608.png]]Pasted image 20250514220608.png文件头部只有

0D 0A 1A 0A

而png文件头部为

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

猜测为png文件,进行补全即可
![[Pasted image 20250514220743.png]]Pasted image 20250514220743.png

图片宽高以及CRC爆破

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

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

第二行前四位是宽度(直接改0384就行),后四位是高度(直接改0096就行)
![[Pasted image 20250514221414.png]]Pasted image 20250514221414.png

在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢?

1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错
![[Pasted image 20250516160621.png]]Pasted image 20250516160621.png
2.2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误
![[Pasted image 20250516161633.png]]Pasted image 20250516161633.png

2.修改CRC

从图片中提取文件

通过cmd的copy命令,可以将文件隐藏在图片里,我们需要从图片中提取文件
![[Pasted image 20250516161855.png]]Pasted image 20250516161855.png1.通过==binwalk==查看图片中的文件
binwalk扫描图片内是否存在其他文件

binwalk 图片路径

提取图片里的文件:

binwalk -e 图片路径 --run-as=root

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

2.通过==foremost==提取图片中的文件
foremost比binwalk更精确一些,有时候可以分离出binwalk分离不出的文件

foremost 图片路径 -o dog  //-o:指定输出的文件夹

JPG隐写

==jpg图片的头数据为==

FF D8 FF

![[Pasted image 20250516162800.png]]Pasted image 20250516162800.png

jpg图片高度修改
1.找到标记代码: FF C0
2.根据: 数据长度: 2字节,精度: 1字节,图像高度: 2字节 , 图像宽度: 2字节
3.修改对应位置的16进制即可
![[Pasted image 20250516162838.png]]Pasted image 20250516162838.png

EXIF信息

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

右击图片,点击熟悉,选择详细信息,这里面可以看到图片拍摄的一些值,有时候还能找到经纬度
![[Pasted image 20250516163554.png]]Pasted image 20250516163554.png
可以用exiftool工具来查看更详细的exif数据:

exiftool cat.jpg

flag可能藏在exif信息中

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

BMP图片隐写

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

bmp的头文件数据为:

42 4D

0-1:42 4D分别表示B和M,说明这是一个BMP格式的图像。
![[Pasted image 20250516164134.png]]Pasted image 20250516164134.png
2-5:8E 26 2C 00,表示图片的大小,即所占的字节数。
![[Pasted image 20250516164141.png]]、Pasted image 20250516164141.png
由于个人计算机都是以小端序,所以数据要从右往左写:2c 26 8e

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

BMP图片高度修改
高度和宽度在第二行,不过区别是需要空两位数字开始数
![[Pasted image 20250516164451.png]]Pasted image 20250516164451.png
没有后缀名的文件,winhex打开这个文件
![[Pasted image 20250516164525.png]]Pasted image 20250516164525.png
文件头为42 4D,这是一个bmp文件,将后缀名改成bmp
用ps打开这个图片,可以看到一个假的flag,并且高度也有些不对
![[Pasted image 20250516164552.png]]Pasted image 20250516164552.png
![[Pasted image 20250516165634.png]]Pasted image 20250516165634.png
将32 01 修改为 32 04,再拖进ps里就能看见flag了

GIF图片隐写

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

GIF图片格式
gif头文件数据为:

47 49 46 38 39 61

GIF帧分离再拼接
分离gif每一帧图片后再拼接:

convert glance.gif flag.png   #一帧一帧分割图片
  • convert:调用 ImageMagick 的 convert 工具
  • glance.gif:输入的 GIF 文件
  • -coalesce:将 GIF 的每一帧分离出来
  • flag_%03d.png:输出文件的命名模式。%03d 表示使用三位数字的序列号来命名文件,例如 flag_001.pngflag_002.png 等

把分离的图片拼成一张图片:

montage flag*.png -tile x1 -geometry +0+0 flag.png     #合并图片
  • montage:调用 ImageMagick 的 montage 工具
  • flag*.png:指定输入文件的模式,flag*.png 表示所有以 flag 开头的 PNG 文件。
  • -tile x1:指定拼接的布局。x1 表示将所有图像水平排列成一排。
  • -geometry +0+0:指定每个图像之间的间距。+0+0 表示没有间距。
  • flag.png:指定输出文件的名称。
GIF图像格式和特征

有些GIF图片每一帧都可能存在规律
![[Pasted image 20250516171000.png]]Pasted image 20250516171000.png
发现打不开这个gif图片,把它拖到winhex里看看
![[Pasted image 20250516171018.png]]Pasted image 20250516171018.png发现文件头数据不见了,我们ctrl+n新建一个文档,然后输入gif的头数据
![[Pasted image 20250516171056.png]]Pasted image 20250516171056.png
回到第一个图片数据,ctrl+a全选,然后复制粘贴到新文件里
![[Pasted image 20250516171113.png]]Pasted image 20250516171113.png
ctrl+s保存
![[Pasted image 20250516171145.png]]Pasted image 20250516171145.png

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

用identify工具来识别规律:

identify -format "%T" flag.gif
  • identify:ImageMagick 工具集中的命令行工具,用于获取图像文件的详细信息。
  • -format "%T":指定输出格式,%T 表示输出图像的修改时间(即文件最后一次被修改的时间)。
  • flag.gif:目标图像文件。
    ![[Pasted image 20250516171455.png]]Pasted image 20250516171455.png将这些值复制出来,新建一个文本文档,将开头的四个6删除过,ctrl+h替换数字,将10全部替换为1,将20全部替换为0。把这些二进制值进行二进制转化ASCII即可
GIF每一帧查看

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

选择要查看的图片导入
选择frame browser即可查看每一帧
![[Pasted image 20250516171807.png]]Pasted image 20250516171807.png

盲水印

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

bwm decode 图1.png 图2.png flag.png
  • decode:表示提取水印。
  • hui.png:原始图像文件。
  • huiwithwm.png:嵌入水印的图像文件。
  • flag.png:输出文件。包含提取的水印信息或去水印后的图像。

LSB隐写

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

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

用到Stegsolve工具:
![[Pasted image 20250516173206.png]]Pasted image 20250516173206.png
用binwalk工具发现了这个图片里还隐藏了一张图片,提取图片
用Stegsolve打开这个图片
选择data extract
![[Pasted image 20250516173326.png]]Pasted image 20250516173326.png
设置red位和lsb模式后,点击preview
![[Pasted image 20250516173343.png]]Pasted image 20250516173343.png查找flag
![[Pasted image 20250516173419.png]]Pasted image 20250516173419.png

提取图像中的隐藏数据

有些题目是利用LSB的特性来往里面隐藏一些字符串
![[Pasted image 20250516173819.png]]Pasted image 20250516173819.png
在最下面发现了隐藏的图片和一串字符串7his_1s_p4s5w0rd,猜测是lsb隐写解密的key值,提取图片
图片提示是lsb隐写,要用到刚刚的key值去解密信息

lsb extract secret.png flag.txt  7his_1s_p4s5w0rd
//extract:提取,后面为需要提取信息的图片和输出的文件名,以及key值
  • lsb:工具名称,用于处理 LSB 隐写术。
  • extract:表示提取操作,用于从图像中提取隐藏信息。
  • secret.png:原始图像文件,可能包含隐藏信息。
  • flag.txt:输出文件,用于保存提取的信息。
  • 7his_1s_p4s5w0rd:密钥(Key),用于解密或提取隐藏信息时所需的密码。

查看文件里的字符串

有些题目往图片里添加一些字符串,可以使用strings工具来查看文件里的字符串
提取文件里的字符串:

strings 图片路径
请前往 登录/注册 即可发表您的看法…