从损坏的 PNG 中恢复图像 header

Recovering image header from a corrupt PNG

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

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

但是,如果您假设图像的宽度和高度都被限制为适合 16 位,比如 1..65535,那么仅使用 CRC 就可以完成。 spoof 将为您执行此操作,您可以在其中提供那些位位置和 header 的 CRC 的 exclusive-or,以及 zeroed-out 宽度和高度,以及CRC存储在header中,当它包含原始宽度和高度时断言是header的CRC。 spoof 通过在 GF(2) 上求解 32 个未知数的 32 个方程的线性方程来做到这一点。

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

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