隐写术浅谈(一):直接附加与IHDR

本文介绍了如何进行信息隐写,包括直接附加方法和利用PNG文件的IHDR数据块隐藏信息。提到了使用十六进制编辑器、KaliLinux工具如Binwalk和Foremost进行反隐写,并提供了Python脚本辅助计算CRC校验。
摘要由CSDN通过智能技术生成

Misc 学习(番外篇) - 隐写分析:隐写术(1)

在前几期,我主要讲了讲自己对于隐写分析的一些浅薄理解,但是大都是针对于如何反隐写(做题嘛,不寒碜),基本上很少讲如何去隐写,这一篇我们开始讨论如何去进行隐写(非 CTF 向)。(此文并非教学,我只是在这里记下我的笔记、我的心得、我的体会,请辩证看待、理性思考,不要全都当成真理)

一. 直接附加

本节我们需要的工具:一个十六进制编辑器(010 Editer 或者 WinHex 等等),反隐写最好有个 Kali Linux 虚拟机

大部分文件类型有其固定的文件结构,基本结构为:
文件头 + 文件内容(+ 文件尾)
那么对于有文件尾的文件类型 A 来说,文件尾之后的内容往往不会对文件的查看有影响,增加的内容普通情况下不会被发现。我们可以添加的不仅是字符,甚至我们可以将其他文件整个添加到文件 A 后。

按照直接附加的原理直接附加只能将文件或数据附加到有文件尾的文件中(JPG、PNG、GIF、ZIP 等),否则就可能出现各种各样的问题。

人工附加

以 PNG 文件当载体为例,用 WinHex 打开载体文件A和要隐藏的文件B,选中文件B的所有数据,Ctrl + C 复制。

回到文件A,选中最后一个字节,直接按 Ctrl + V 粘贴,然后按 Ctrl + S 保存,附加完成。

脚本附加

由于孩子 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,更改它的宽和高。

我们将高改为 00 00 00 FB ,保存,更改前后变化如下图所示。

脚本隐写

不会吧,这么简单你还想用脚本?

开个玩笑,虽然隐写用不到脚本,但是我们可以用脚本计算一下篡改后的 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”代表一个字节,第四个是符号是因为他刚好属于可打印字节,把它打到右边就行),保存,确定更新,得到原图。

本期就先说到这里,针对于如何进行信息隐写,主要讲了讲隐写术中的直接附加和部分 PNG 图片隐写方法,写的不太好的地方还请包涵并提出您宝贵的建议,我们下期再见。

参考资料

[1] 从0开始学杂项 第二期:隐写分析(1) 直接附加 :https://blog.csdn.net/CHTXRT/article/details/128709665

[2] 从0开始学杂项 第三期:隐写分析(2) PNG 图片隐写 :https://blog.csdn.net/CHTXRT/article/details/128714931

以上内容仅供参考,水平不高,大佬见笑。

下一篇:隐写术浅谈(二):LSB隐写与IDAT隐写

作者:CHTXRT

出处:https://blog.csdn.net/CHTXRT

本文使用「CC BY-ND 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值