PNG隐写的简单实战教程(CRC爆破,MSB隐写,binwalk分离)

一、引言


1. PNG隐写的概念和应用场景

PNG隐写术是一种将隐藏的信息嵌入到PNG图像中的技术。隐写术的目标是使嵌入的信息在图像中几乎不可察觉,同时保持图像的原始外观。这种技术的应用场景涉及隐私、安全和数字水印等方面。
概念:

  1. 隐藏信息: 隐写术通过在图像中修改像素值或利用图像的特性来嵌入文本、图像或其他数据。这种隐藏的信息可以是文本、二进制数据、加密的消息等。
  2. 无感知性: 隐写术的关键是确保嵌入的信息对于人眼来说是不可察觉的,即不引起图像外观的明显变化。这通常需要在保持图像质量的同时进行微小而智能的修改。

应用场景

  1. 数字水印: 隐写术可用于在图像中嵌入数字水印,以证明图像的所有权、来源或防止未经授权的复制。数字水印可以在版权保护、图像认证等领域发挥作用。
  2. 隐私保护: 隐写术可用于在图像中隐藏私人信息,例如隐藏在社交媒体上分享的照片中的地理位置或个人身份信息。这有助于保护用户的隐私。
  3. 信息隐藏: 在一些安全场景中,可以使用隐写术将机密信息隐藏在看似普通的图像中,以进行隐秘的通信或信息交换。
  4. 数字取证: 在数字取证领域,隐写分析可用于检测图像中是否存在隐藏的信息,这有助于调查犯罪行为或确定图像的真实性。
  5. 通信安全: 隐写术可用于在通信中隐藏敏感信息,从而提高信息传输的安全性。这对于军事通信、情报传递等领域可能是关键的。

  需要注意的是,尽管隐写术有许多合法应用,但它也可能被用于非法目的,如隐瞒恶意软件或进行网络攻击。因此,隐写术的应用应受到法规和伦理框架的监管。

2. 为什么选择PNG格式进行隐写

选择PNG格式进行隐写有几个原因,其中一些特性使得PNG成为一个相对合适的选择:

  1. 无损压缩: PNG是一种无损压缩格式,这意味着图像的质量不会因为压缩而损失。这对于保持嵌入信息的完整性至关重要,尤其是当隐藏的信息是敏感或需要准确还原时。
  2. 支持透明度: PNG支持透明度,允许图像中的某些部分是完全透明的。这为隐写提供了更多的灵活性,因为可以选择性地在图像的不同区域进行信息隐藏,而不影响整体外观。
  3. 颜色深度和调色板: PNG支持不同的颜色深度和调色板,使得可以在图像中隐藏更多的信息,同时保持较小的文件尺寸。调色板(PLTE块)可以用于嵌入额外的信息。
  4. 灵活性: PNG是一种灵活的图像格式,支持多种颜色模式和压缩方法。这使得可以根据具体的隐写需求选择最合适的参数。
  5. 普及度: PNG是一种广泛使用的图像格式,在互联网和数字图像处理领域中得到广泛支持。因此,PNG图像更容易在各种应用和平台上流通,使得嵌入的信息更容易分享和传播。

  尽管PNG在这些方面具有优势,但在选择隐写载体时,还需要考虑其他因素,如目标使用场景、隐写的安全性等。在一些特殊情况下,可能会选择其他图像格式或隐写技术,以满足特定的需求。

3. PNG隐写的优势和局限性

优势:

  1. 无损压缩: PNG是一种无损压缩格式,允许嵌入信息而不损失图像质量。这对于需要保持数据完整性的应用场景非常重要。
  2. 透明度支持: PNG支持透明度,使得可以在图像的部分区域进行信息隐藏,而不影响其他区域的外观。这提供了更灵活的隐写选项。
  3. 颜色深度和调色板: 可以根据需要选择不同的颜色深度和调色板,使得在图像中嵌入更多的信息成为可能。这提供了一定程度的自定义能力。
  4. 普及度: PNG是一种常见的图像格式,得到广泛支持,因此嵌入的信息在不同平台和应用之间更容易共享和传播。

局限性:

  1. 文件尺寸较大: 相对于一些有损压缩格式,如JPEG,PNG文件通常较大。这可能限制了隐写的容量,尤其是当需要嵌入大量信息时。
  2. 不适用于连续色彩变化: PNG主要适用于包含块状图案或图像的场景,而在连续色彩变化的图像中,隐写可能更容易被察觉。
  3. 隐写容量有限: PNG格式中可以用于隐写的空间有限,因为图像的颜色深度和其他特性限制了可以修改的像素数量,从而限制了隐写的容量。
  4. 可能被检测: 随着隐写分析技术的不断发展,PNG隐写可能会被一些专门的工具或算法检测出来。这使得对于一些对安全性要求极高的应用场景,PNG隐写可能不是最理想的选择。
  5. 不同实现的兼容性: 隐写的成功也可能受到不同PNG解析器和实现的影响,因为一些实现可能在解析时进行了优化或过滤。

总体而言,PNG隐写在一些特定的场景下是有效的,但在选择隐写载体时需要综合考虑文件尺寸、隐写容量、安全性等因素。

二、PNG文件结构简介


1. PNG文件的基本结构

PNG(Portable Network Graphics)是一种无损压缩的图像文件格式,具有开放标准。PNG文件的基本结构由文件头、图像数据和文件尾三个部分组成。

1.文件头(Header):
  • PNG文件的头部占据文件的最前面,长度为8个字节。
  • 文件头的内容固定为
    89 50 4E 47 0D 0A 1A 0A
  • 分别代表ASCII码中的
    ‰PNG\r\nZ\n

2.图像数据(Image Data):

  • 文件头之后是图像数据块,包括若干个数据块,每个块包含不同的信息。
  • 数据块包括关键的IHDR(图像头部)、PLTE(调色板)、IDAT(图像数据)、IEND(图像结束)等,具体顺序可以有所不同。
  • IHDR数据块包含了图像的基本信息,如宽度、高度、位深度、颜色类型等。
  • IDAT数据块包含图像的实际像素数据,采用压缩算法进行无损压缩。

3.文件尾(End of File):

  • 文件尾部分仅包含12个字节
  • 文件尾的内容固定为IEND

总体结构如下:

[文件头] [图像数据块1] [图像数据块2] ... [图像数据块n] [文件尾]

每个数据块由4部分组成:

  • 长度字段: 4个字节,表示数据块的长度。
  • 类型码: 4个字节,表示数据块的类型。
  • 数据字段: 长度可变,包含实际数据。
  • CRC(循环冗余检验): 4个字节,用于检测数据块的完整性。
注意事项:
  • PNG文件中的图像数据块可以按照不同的顺序出现,但IHDR必须在第一个位置,IEND必须在最后一个位置。
  • 图像数据块之间使用CRC进行校验,以确保数据的完整性。
  • PNG支持不同的颜色类型和位深度,使其适用于多种图像处理需求。

  了解PNG文件的基本结构有助于理解如何解析和处理PNG图像,特别是在进行图像处理或元数据提取时。

2. PNG文件中的IHDR、IDAT、IEND等重要数据块的作用

PNG文件采用一种基于块(chunk-based)的结构,其中包含不同类型的数据块,每个数据块都有特定的作用。以下是几个重要的PNG数据块及其作用:

1.IHDR(Image Header):

  • 作用: 包含图像的基本信息。
  • 内容:    
  • 宽度(4个字节)
  • 高度(4个字节)
  • 位深度(1字节)
  • 颜色类型(1字节)
  • 压缩方法(1字节)
  • 滤波器方法(1字节)
  • 隔行扫描方法(1字节)


2.PLTE(Palette):

  • 作用: 当图像采用索引颜色时,该块包含调色板信息。
  • 内容: 包含RGB三元组的列表,定义颜色与调色板索引的映射


3.IDAT(Image Data):

  • 作用: 包含图像的实际像素数据。
  • 内容: 通过DEFLATE算法进行压缩的图像数据。
  • 注意: 图像的实际像素数据可能会分成多个IDAT块,允许对图像进行逐步加载。


4.IEND(Image End):

  • 作用: 标识图像数据的结束。
  • 内容: 无。


5.tEXt(Textual Data):

  • 作用: 包含文本信息,如关于图像的描述、作者等。
  • 内容: 关键字和文本字符串。


6.zTXt(Compressed Textual Data):

  • 作用: 类似于tEXt,但采用压缩算法进行数据压缩。
  • 内容: 关键字、压缩方法、压缩后的文本数据。


7.pHYs(Physical Pixel Dimensions):

  • 作用: 提供图像的物理尺寸和像素比例。
  • 内容: 水平像素数、垂直像素数、单位。

  这些数据块以及其他可能的数据块一起构成了PNG文件的结构。在解析PNG文件时,读取和理解这些数据块是关键,以正确渲染图像或进行其他处理。由于PNG是一种灵活的格式,可以支持多种颜色类型、压缩方法和滤波器方法,这使得它适用于各种图像应用场景。

3. PNG文件的压缩算法(如DEFLATE)

PNG文件使用DEFLATE压缩算法来对图像数据进行压缩。DEFLATE是一种无损数据压缩算法,它基于霍夫曼编码(Huffman Coding)和Lempel-Ziv压缩算法的组合。以下是DEFLATE压缩算法的基本原理:

1.Lempel-Ziv压缩: DEFLATE算法的一部分是Lempel-Ziv(LZ)压缩算法,它通过找到和利用数据中的重复模式来实现压缩。

  • 字典: LZ算法使用一个字典,其中存储了已经遇到的字符串。每次发现一个新的字符串时,将其添加到字典中。
  • 指针和长度: 当发现字符串在字典中存在时,使用指针和长度来表示字典中相应的条目,从而实现对字符串的引用。


2.霍夫曼编码: DEFLATE还使用霍夫曼编码来进一步压缩数据。霍夫曼编码是一种变长编码,其中较常见的符号用较短的编码表示,较不常见的符号用较长的编码表示。

  • 构建霍夫曼树: 需要构建一个霍夫曼树,其中每个叶节点对应一个符号,其路径上的位表示该符号的编码。
  • 生成编码: 根据霍夫曼树生成每个符号的编码,确保没有一个编码是其他编码的前缀。

在DEFLATE中,Lempel-Ziv和霍夫曼编码的结合使得相同的数据块能够更有效地被表示和存储。这种组合允许PNG图像以较小的文件尺寸保存,同时保留图像的无损特性。 DEFLATE算法在PNG中的使用使得PNG成为一种理想的图像格式,尤其适用于需要高质量图像但又要求较小文件尺寸的应用场景。

三、PNG隐写原理


1. 利用PNG文件的无损压缩特性进行隐写
2. 修改PNG文件中的关键数据块,实现信息的嵌入和提取
3. 隐写的安全性分析

四、PNG隐写实战教程


1. 准备工具和环境
   - 安装Python环境,java环境
   - 安装Pillow库(Python Imaging Library,简称PIL)

   -安装010 editor ,stegsolve等工具(具体的软件和安装方法可以去看其他大佬的博客)
2. 编写PNG隐写程序
   - 读取原始图片和待隐藏信息
   - 将待隐藏信息转换为二进制数据
   - 修改PNG文件中的关键数据块,嵌入二进制数据
   - 保存修改后的PNG文件
3. 编写PNG隐写提取程序
   - 读取包含隐藏信息的PNG文件
   - 提取关键数据块中的二进制数据
   - 将二进制数据转换为原始信息
4. 实例演示

题目为ISCTF2023中的一道:PNG的基本食用

1.老习惯先用010打开分析一下

打开后发现CRC被修改了,使用python脚本爆破CRC,代码附下(解题结束后)

在010或winhex中修改图片的高宽保存得到原来的图片

修改后的图片:

得到flag的第一部分

2.同样使用010打开第二张图片观察

没有异常,使用stegslove打开

没有发现盲水印,分析一下发现第二段flag

3.接着分析第三张图片

数据异常,怀疑图片中有隐藏文件,使用binwalk分析(关于binwalk可以看我的另一篇文章,专门讲安装和使用binwalk)

发现70658字节处有隐藏的zip文件,将它分离出来

将分离出来的文件解压得到第三段flag

至此,三张图片都已破解得到flag。

crc爆破宽高
import zlib
import struct
import argparse
import itertools


parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,
                    help="输入同级目录下图片的名称")
args  = parser.parse_args()


bin_data = open(args.f, 'rb').read()
crc32key = zlib.crc32(bin_data[12:29]) # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc


if crc32key == original_crc32: # 计算crc对比原始crc
    print('宽高没有问题!')
else:
    input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):")
    if input_ not in ["Y", "y", ""]:
        exit()
    else: 
        for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度
            data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
            crc32 = zlib.crc32(data)
            if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
                print(f"\nCRC32: {hex(original_crc32)}")
                print(f"宽度: {i}, hex: {hex(i)}")
                print(f"高度: {j}, hex: {hex(j)}")
                exit(0)


 

五、PNG隐写的优缺点分析


1. 优点
   - 无损压缩,不影响图片质量
   - 隐藏效果好,难以被察觉
2. 缺点
   - 嵌入信息量有限,受图片大小和颜色通道数限制
   - 需要对PNG文件结构有一定了解,编写程序较复杂

  • 28
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐澜霖漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值