
图片隐写
1.各种图片文件的头数据以及判断是什么类型的图片
2.png图片隐写
3.jpg图片隐写
4.gif图片隐写
5.bmp图片隐写
6.从图片中提取文件
7.lsb隐写
8.盲水印
9.exif隐写
10.图片宽高修改
计算机文件: 文件由一大堆10101110……的二进制码组成,现代大多数电脑的操作系统中,文件是数据的容器,格式主要它的内容定义
PNG隐写
将图片拖入winhex里,就能看见文件的十六进制码
![[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]]
在最下面,可以看到一个倒过来的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]]
图片无法打开,拖入winhex里
![[Pasted image 20250514220608.png]]文件头部只有
0D 0A 1A 0A
而png文件头部为
89 50 4E 47 0D 0A 1A 0A
猜测为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]]
在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢?
1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错
![[Pasted image 20250516160621.png]]
2.2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误
![[Pasted image 20250516161633.png]]
2.修改CRC
从图片中提取文件
通过cmd的copy命令,可以将文件隐藏在图片里,我们需要从图片中提取文件
![[Pasted image 20250516161855.png]]1.通过==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]]
jpg图片高度修改
1.找到标记代码: FF C0
2.根据: 数据长度: 2字节,精度: 1字节,图像高度: 2字节 , 图像宽度: 2字节
3.修改对应位置的16进制即可
![[Pasted image 20250516162838.png]]
EXIF信息
在我们拍摄图片时,exif可以记录数码照片的属性信息和拍摄数据
右击图片,点击熟悉,选择详细信息,这里面可以看到图片拍摄的一些值,有时候还能找到经纬度
![[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]]
2-5:8E 26 2C 00,表示图片的大小,即所占的字节数。
![[Pasted image 20250516164141.png]]、
由于个人计算机都是以小端序,所以数据要从右往左写:2c 26 8e
0x002c268e == 2893454(Byte) == 2.75M
BMP图片高度修改
高度和宽度在第二行,不过区别是需要空两位数字开始数
![[Pasted image 20250516164451.png]]
没有后缀名的文件,winhex打开这个文件
![[Pasted image 20250516164525.png]]
文件头为42 4D,这是一个bmp文件,将后缀名改成bmp
用ps打开这个图片,可以看到一个假的flag,并且高度也有些不对
![[Pasted image 20250516164552.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.png
,flag_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]]
发现打不开这个gif图片,把它拖到winhex里看看
![[Pasted image 20250516171018.png]]发现文件头数据不见了,我们ctrl+n新建一个文档,然后输入gif的头数据
![[Pasted image 20250516171056.png]]
回到第一个图片数据,ctrl+a全选,然后复制粘贴到新文件里
![[Pasted image 20250516171113.png]]
ctrl+s保存
![[Pasted image 20250516171145.png]]
现在就能正常读取gif图片了,但是并没有显示flag,而且图片也不是动图,猜测它的每一帧都有规律
用identify工具来识别规律:
identify -format "%T" flag.gif
identify
:ImageMagick 工具集中的命令行工具,用于获取图像文件的详细信息。-format "%T"
:指定输出格式,%T
表示输出图像的修改时间(即文件最后一次被修改的时间)。flag.gif
:目标图像文件。
![[Pasted image 20250516171455.png]]将这些值复制出来,新建一个文本文档,将开头的四个6删除过,ctrl+h替换数字,将10全部替换为1,将20全部替换为0。把这些二进制值进行二进制转化ASCII即可
GIF每一帧查看
如果想查看gif图片的每一帧,则可以使用Stegsolve工具
选择要查看的图片导入
选择frame browser即可查看每一帧
![[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]]
用binwalk工具发现了这个图片里还隐藏了一张图片,提取图片
用Stegsolve打开这个图片
选择data extract
![[Pasted image 20250516173326.png]]
设置red位和lsb模式后,点击preview
![[Pasted image 20250516173343.png]]查找flag
![[Pasted image 20250516173419.png]]
提取图像中的隐藏数据
有些题目是利用LSB的特性来往里面隐藏一些字符串
![[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 图片路径