正在从损坏的PNG中恢复图像标头

  • 本文关键字:恢复 图像 PNG 损坏 crc
  • 更新时间 :
  • 英文 :


我正在处理一个pentesting挑战,其中提供了一个损坏的PNG,IHDR块中的八个维度字节全部设置为零。CRC校验和和文件的其余部分仍然完好无损。我想知道是否有一种方法可以通过某种方式反转CRC来恢复图像维度,因为据我所知,CRC是根据块的字节计算的。如果这不可能,是否有其他方法可以根据图像数据找到尺寸?任何帮助都将不胜感激。

一般来说,不,您无法从32位CRC中恢复62位信息。(它是62而不是64,因为规范将每个的范围限制为1..231。(

然而,如果假设图像宽度和高度都被限制为分别适合16位,比如1..65535,那么它可以只使用CRC来完成。恶搞将为您做到这一点,您可以提供这些位位置和标头的CRC的异或,宽度和高度为零,以及存储在标头中的CRC,当标头包含原始宽度和高度时,断言为标头的CRC。欺骗通过求解32个未知数中32个方程的GF(2(上的线性方程来实现这一点。

如果您也使用被断言为完整的图像数据,那么对于非常大的图像,这通常可以解决。使用其余的头部信息并对图像数据进行解码,可以将解压缩数据中总字节的整数作为其素数分解的因子。然后将有少量可能的分解为行和列。您可以在标头中尝试其中的每一个,以查看哪些与CRC匹配。有些甚至在检查CRC之前就可能被排除,因为一行中的字节数必须是每个像素的一加上字节的倍数,例如RGB图像为三个,RGBA为四个。(事实上,对于问题中最初提供的损坏图像,只有一个因子分解满足该约束,这就是答案。(

在极不可能的情况下,其中不止一个匹配CRC,您可以使用每个来解压缩图像,并查看哪一个看起来正确。其他的可能看起来非常扭曲,就像一台旧电视无法锁定接收信号的水平同步。

最新更新