隐写术之pngIDAT隐藏信息

该博客介绍了在CTF挑战中遇到的一道涉及png文件的题目,通过分析文件格式,利用winhex工具发现文件末尾的base64编码,并通过解码揭示隐藏的flag。在无法通过常规手段解压后,作者深入研究png结构,找到高度为0导致图片不可见的问题,修改高度后正常显示图片。进一步研究发现PNG的IDAT块可用于隐藏信息,通过对IDAT区的数据处理,成功提取出隐藏的flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:奇怪的图片

题目文件网址:

 https://pan.baidu.com/s/1CF8jApx7_7omDzzgnFDFZg

提取码:v7bu

说明:此题主要考察对png文件格式的了解。

本篇思路参考博客:
https://www.cnblogs.com/k1two2/p/5170178.html pngIDAT隐藏数据
https://blog.youkuaiyun.com/liuzxQAQ/article/details/79749981 pngIDAT数据提取
https://www.cnblogs.com/lidabo/p/3701197.html png格式详解
P.S 解法的思路描述较复杂,若想直接解题请下载文件后用winhex打开,从步骤6看起。

解法:

1、下载压缩包,打开发现flag.txt发现需要密码。遂先用Advanced RAR Password Recovery破解试试。

2、发现软件提示此非rar压缩包。
在这里插入图片描述说明此文件非有效的rar压缩包,由于题目提示有图片,于是将文件用binwalk跑一下,看看这到底是什么文件。

<think>嗯,用户问的是如何在PNG的IDAT块中嵌入恶意代码或者隐藏数据的技术。首先,我需要回忆一下PNG文件的结构,特别是IDAT块的作用。IDAT块存储的是图像的实际像素数据,通常经过压缩,所以隐藏信息可能会利用压缩过程中的某些特性。 根据引用[1],之前有人通过修改图片高度来隐藏信息,导致图片无法正常显示,这样常规工具可能检测不出来。所以,修改文件头中的高度值可能是一种方法。不过用户现在关心的是IDAT块本身,所以可能需要更深入的分析。 然后,引用[2]提到预测器状态用于差分编码,这可能涉及到在压缩前的预处理步骤中插入数据。PNG使用的zlib压缩,可能在压缩后的数据中直接插入额外字节,但需要注意不影响图像的正常显示,否则容易引起怀疑。比如,在IDAT块末尾添加数据,或者利用多个IDAT块的结构,将隐藏信息分散存储。 另外,引用[3]提到IDAT块异常的情况,可能涉及到对压缩数据的修改。比如,在压缩后的数据流中插入特定的字节,或者在编码过程中使用LSB隐写术,但这种方法可能对图像质量影响较大,容易被发现。 还需要考虑的是,如何确保嵌入的数据不会破坏PNG文件的校验和,每个块都有CRC校验,所以修改后必须重新计算CRC值,否则文件会损坏。因此,嵌入数据时需要同时更新CRC。 另外,恶意代码的嵌入可能不只是简单的数据附加,可能需要利用漏洞。例如,某些图像查看器或处理库在解析IDAT块时可能存在缓冲区溢出漏洞,通过构造特定的压缩数据来触发漏洞执行代码。不过这可能属于更高级的攻击技术,需要具体漏洞的支持。 总结可能的步骤:1. 修改文件头参数(如高度)来隐藏数据;2. 在IDAT压缩数据中插入额外字节,利用预测器或过滤方法;3. 使用LSB在像素数据中;4. 利用多个IDAT块分散隐藏信息;5. 构造恶意数据触发漏洞。 但需要注意的是,这些技术可能被用于非法用途,回答时应强调合法性和道德规范,同时提供的信息应足够帮助用户理解原理,而不鼓励滥用。</think>在PNG的IDAT块中嵌入隐藏数据或恶意代码的技术主要涉及对图像压缩数据的特殊处理,以下是核心原理和实现方法: ### 一、IDAT块隐藏数据的基本原理 1. **压缩数据插入** PNG的IDAT块存储经zlib压缩的像素数据,可通过在压缩流中插入冗余数据实现隐藏。由于zlib支持多IDAT块,可在最后一个有效IDAT块后追加包含隐藏数据的IDAT块[^1]。 2. **预测器编码利用** 在过滤阶段(Filtering)使用差分编码时,可通过修改预测器类型字节(Filter byte)的低位嵌入信息。例如: ``` 原始字节:0x01 像素数据... 修改字节:0x01|嵌入比特 像素数据... ``` 3. **LSB扩展** 对解压后的像素数据实施最低有效位(LSB)修改,再重新压缩。此方法需注意压缩后数据体积变化规律[^2]。 ### 二、关键技术实现步骤 ```python import zlib def embed_data(png_path, payload): # 提取原始IDAT数据 with open(png_path, 'rb') as f: data = f.read() idat_start = data.find(b'IDAT') + 4 idat_end = data.find(b'IEND') zlib_data = data[idat_start:idat_end] # 解压并嵌入数据 decompressed = zlib.decompress(zlib_data) modified = decompressed + b'###' + payload # 添加标记和载荷 new_zlib = zlib.compress(modified) # 重建PNG文件 new_data = data[:idat_start] + new_zlib + data[idat_end:] with open('modified.png', 'wb') as f: f.write(new_data) ``` ### 三、对抗检测的关键 1. **CRC校验修正** 每个IDAT块包含CRC32校验值,嵌入后需重新计算: $$ \text{CRC} = \text{CRC32}(\text{chunk_type} + \text{modified_data}) $$ 2. **多IDAT块分割** 将隐藏数据分散到多个IDAT块中,避免单个块大小异常。标准建议每个IDAT块不超过32768字节[^3]。 3. **压缩率伪装** 保持原始压缩级别(通常zlib level=6),避免压缩率异常引发检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值