Misc 学习(番外篇) - 隐写分析:隐写术(1)
在前几期,我主要讲了讲自己对于隐写分析的一些浅薄理解,但是大都是针对于如何反隐写(做题嘛,不寒碜),基本上很少讲如何去隐写,这一篇我们开始讨论如何去进行隐写(非 CTF 向)。(此文并非教学,我只是在这里记下我的笔记、我的心得、我的体会,请辩证看待、理性思考,不要全都当成真理)
一. 直接附加
本节我们需要的工具:一个十六进制编辑器(010 Editer 或者 WinHex 等等),反隐写最好有个 Kali Linux 虚拟机
大部分文件类型有其固定的文件结构,基本结构为:
文件头 + 文件内容(+ 文件尾)
那么对于有文件尾的文件类型 A 来说,文件尾之后的内容往往不会对文件的查看有影响,增加的内容普通情况下不会被发现。我们可以添加的不仅是字符,甚至我们可以将其他文件整个添加到文件 A 后。
按照直接附加的原理,直接附加只能将文件或数据附加到有文件尾的文件中(JPG、PNG、GIF、ZIP 等),否则就可能出现各种各样的问题。
人工附加
以 PNG 文件当载体为例,用 WinHex 打开载体文件A和要隐藏的文件B,选中文件B的所有数据,Ctrl + C 复制。
![](https://i-blog.csdnimg.cn/blog_migrate/60ab254b1c59294035eeca58f4b30749.png)
回到文件A,选中最后一个字节,直接按 Ctrl + V 粘贴,然后按 Ctrl + S 保存,附加完成。
![](https://i-blog.csdnimg.cn/blog_migrate/5d596b56c470a73a8faa85f60197b4d4.png)
脚本附加
由于孩子 Python 学的太烂,这一节先空着。
反附加
我推荐使用 Binwalk 工具(Kali Linux自带)和 Foremost 工具(如果你的 linux 没有的话可以输入 apt-get install foremost 回车,其他工具类似)分离文件A中附加的其他文件,Binwalk 可以自动分析一个文件中包含的多个文件并将它们提取出来,Foremost 也可以分离文件而且有时候更好用一点,我们可以先用 Binwalk 进行分析,如果有隐藏文件再用 Foremost 分离,我们经常使用的一些相关使用方法如下:
binwalk [文件A] #分析文件A
binwalk -e [文件A] #分析文件A后自动提取已知的文件类型的隐藏文件
foremost [文件A] #分离文件A的隐藏文件,存到与文件A同目录的output文件夹中,同时在文件夹中生成一个日志文件
二. IHDR 隐藏图片部分(PNG)
本节我们需要的工具:一个十六进制编辑器,Python 环境
对于一个 PNG 文件来说,其具有固定的文件头、文件尾,文件内容由3个以上的 PNG 的数据块按顺序组成,第一块是 文件头数据块( IHDR),它由第11——32字节组成(从0开始),包含有 PNG 文件中存储的图像数据的基本信息,数据从第 16字节开始,有13个字节,其前8字节分别用4个字节规定了图片的宽和高(十六进制,以像素为单位)。
我们可以用十六进位文件编辑器更改它们使得这张图片显示不完整,从而达到隐藏信息的目的。此时它的图片数据仍然没变,在Windows图片查看器中超过规定的图片宽高的部分只是不显示了。
人工隐写
按照 PNG 相关原理,我们使用十六进制编辑器打开要更改的文件A,更改它的宽和高。
![](https://i-blog.csdnimg.cn/blog_migrate/ca47c1aaba635b99a589865c8a64da61.png)
我们将高改为 00 00 00 FB ,保存,更改前后变化如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/7717fb61bca62b4d9f1e1c897457fd60.png)
脚本隐写
不会吧,这么简单你还想用脚本?
开个玩笑,虽然隐写用不到脚本,但是我们可以用脚本计算一下篡改后的 IHDR 块的 CRC,再用编辑器更改第 29——32字节,这样可以让图片查看器看不出图片的错误,同时也会使下面的反隐写方式失效。
#使用 python [本脚本文件名] [更改后的图片文件名] 得到的字符串去掉最前面的0x,得到的就是16进制的四字节CRC码
import zlib
import struct
import sys
filename = sys.argv[1]
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
crc32result = zlib.crc32(data)
print(hex(crc32result))
exit(0)
反隐写
细心的同学会发现在 Kali Linux 中是打不开手动附加的半隐藏图片的,会提示 IHDR CRC error,这是因为在每个数据块的最后4字节都有 CRC(循环冗余检测)用来检测是否有错误和被篡改。聪明的同学自然就想到是不是可以用 CRC 反推图片原来的宽和高,答案是肯定的,我们可以利用 python 脚本反推图片原宽高,然后用十六进制编辑器打开图片修改图片宽高得到原图片。
#使用 python [本脚本文件名] [图片文件名]
import zlib
import struct
import sys
filename = sys.argv[1]
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(),16)
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("宽为:",end="")
print(width)
print("高为:",end="")
print(height)
exit(0)
用 Winhex 打开,找到 IHDR 中的宽高,更改一下(上面的“\x00”代表一个字节,第四个是符号是因为他刚好属于可打印字节,把它打到右边就行),保存,确定更新,得到原图。
![](https://i-blog.csdnimg.cn/blog_migrate/5aa747dcd675962c30181e8584c01066.png)
本期就先说到这里,针对于如何进行信息隐写,主要讲了讲隐写术中的直接附加和部分 PNG 图片隐写方法,写的不太好的地方还请包涵并提出您宝贵的建议,我们下期再见。
参考资料
[1] 从0开始学杂项 第二期:隐写分析(1) 直接附加 :https://blog.csdn.net/CHTXRT/article/details/128709665
[2] 从0开始学杂项 第三期:隐写分析(2) PNG 图片隐写 :https://blog.csdn.net/CHTXRT/article/details/128714931
以上内容仅供参考,水平不高,大佬见笑。
作者:CHTXRT
出处:https://blog.csdn.net/CHTXRT
本文使用「CC BY-ND 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。