This question自然导致我关于这个主题的Wikipedia page。文章提到了一个45.1 kb的zip文件解压缩到1.3艾字节的例子。
首先用于创建此类文件的原则/技术是什么?我不想实际做到这一点,对所涉概念的简化“如何工作”解释更感兴趣。
P.S。
文章提到了9层zip文件,所以这不是一个简单的压缩零串的情况。为什么9,为什么每个10个文件?
答案 0 :(得分:87)
引用维基百科页面:
Zip炸弹的一个例子是文件 45.1.zip是45.1千字节的压缩数据,包含9个 嵌套的zip文件的层数 10,每个底层存档 包含1.30千兆字节的文件 未压缩的总计1.30艾字节 数据
所以你只需要一个装满零的1.3GB文件,将其压缩成ZIP文件,制作10份,将其打包成ZIP文件,并重复此过程9次。
通过这种方式,您可以获得一个文件,当完全未压缩时,会生成一个荒谬的数据量,而不需要您开始使用该数量。
此外,嵌套档案使病毒扫描程序(这些“炸弹”的主要目标)等程序变得更加智能,并且拒绝解压缩“太大”的档案,因为直到最后一级总量数据并不是那么多,你没有“看到”最低级别的文件有多大,直到你达到那个级别,并且每个单独的文件都不是“太大” - 只有大量的文件才有问题。
答案 1 :(得分:38)
创建一个1.3 exabyte的零文件。
右键单击>发送到压缩(zipped)文件夹。
答案 2 :(得分:31)
这可以在Linux下使用以下命令轻松完成:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
将count替换为您要压缩的KB数。上面的例子创建了一个10MiB拉链炸弹(根本没有炸弹,但它显示了这个过程)。
您不需要硬盘空间来存储所有未压缩的数据。
答案 3 :(得分:10)
以下是Windows:
来自Security Focus proof of concept(NSFW!),它是一个包含16个文件夹的ZIP文件,每个文件夹有16个文件夹,这样就可以了(42个是zip文件名):
\ 42 \ lib 0 \ book 0 \ chapter 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ chapter F \ doc F \ 0.dll
我可能错了这个数字,但它产生了4 ^ 16(4,294,967,296)个目录。因为每个目录需要N个字节的分配空间,所以它最终会很大。最后的dll文件是0字节。
单独解压缩第一个目录\42\lib 0\book 0\chapter 0\doc 0\0.dll
会产生4gb的分配空间。
答案 4 :(得分:8)
认真回答:
(非常基本)压缩依赖于发现重复模式,因此zip文件将包含表示类似
的数据0x100000000000000000000000000000000000
(Repeat this '0' ten trillion times)
非常短的zip文件,但扩展它时会很大。
答案 5 :(得分:5)
要在实际设置中创建一个(即不在您的巨大硬盘上创建1.3 exabyte文件),您可能必须在二进制级别学习文件格式并编写一些转换为您所需文件的内容,后压缩。
答案 6 :(得分:5)
文章提到了9层的zip文件,所以这不是一个简单的拉链零串的情况。为什么9,为什么每个10个文件?
首先,维基百科文章目前称5层,每层16个文件。不确定差异的来源,但并非所有相关的。真正的问题是为什么首先使用嵌套。
DEFLATE是zip文件*唯一常用的压缩方法,最大压缩率为1032.对于任何1-3字节的重复序列,这可以渐进地实现。无论你对zip文件做什么,只要它只使用DEFLATE,解压缩的大小最多只能是原始zip文件的1032倍。
因此,有必要使用嵌套的zip文件来实现真正令人难以置信的压缩率。如果你有2层压缩,最大比率变为1032 ^ 2 = 1065024.对于3,它是1099104768,依此类推。对于42.zip中使用的5层,理论最大压缩比为1170572956434432.正如您所看到的,实际的42.zip远非该水平。其中一部分是zip格式的开销,部分原因是它们并不关心。
如果我不得不猜测,我会说42.zip只是创建一个大的空文件,并反复压缩和复制它。没有尝试突破格式的限制或最大化压缩或任何东西 - 他们只是任意选择每层16个副本。关键在于不费力地创建大型有效载荷。
注意:其他压缩格式(如bzip2)提供了更多,更大,更大的最大压缩率。但是,大多数拉链解析器都不接受它们。
P.S。可以创建一个zip文件,它将解压缩到自己的副本(quine)。您也可以制作一个解压缩到自身的多个副本。因此,如果您永久地递归解压缩文件,则最大可能的大小是无限的。唯一的限制是每次迭代最多可以增加1032个。
P.P.S。 1032图假设zip中的文件数据是不相交的。 zip文件格式的一个怪癖是它有一个中心目录,列出归档中的文件和文件数据的偏移量。如果创建指向相同数据的多个文件条目,即使没有嵌套也可以实现更高的压缩率,但解析器可能会拒绝这样的zip文件。
答案 7 :(得分:4)
创建zipbomb(或gzbomb)的一个好方法是知道您要定位的二进制格式。否则,即使您使用流文件(例如使用/dev/zero
),您仍然会受到压缩流所需的计算能力的限制。
gzip炸弹的一个很好的例子:http://selenic.com/googolplex.gz57(在几级压缩后,文件中嵌入了一条消息,导致文件很大)
找到那条消息很有趣:)
答案 8 :(得分:2)
也许,在unix上,你可以将一定数量的零直接输入到zip程序中吗?不知道unix如何解释你将如何做到这一点。除此之外,你需要一个零源,并将它们管道输入一个从stdin或其他东西读取的拉链......
答案 9 :(得分:2)
所有文件压缩算法都依赖于要压缩的entropy信息。 从理论上讲,你可以压缩0或1的流,如果它足够长,它将压缩得非常好。
这是理论部分。实际部分已经被其他人指出。
答案 10 :(得分:2)
最近(1995年后)压缩算法,如bz2,lzma(7-zip)和rar,可以对单调文件进行精彩压缩,单层压缩足以将超大内容包装到可管理的大小。
另一种方法可能是创建一个极端大小(exabytes)的稀疏文件,然后使用可以理解稀疏文件(例如tar)的普通文件来压缩它,现在如果审查员流出文件,审查员将需要阅读所有这些文件零只存在于文件的实际内容之间,如果审查员将其写入磁盘,但是将使用很少的空间(假设一个表现良好的unarchiver和一个现代文件系统)。
答案 11 :(得分:2)
试过了。输出zip文件大小是一个小的84-KB文件。
到目前为止我做的步骤:
虽然我不知道如何解释重命名的zip文件的压缩仍然将其压缩为更小的部分,但它的工作原理。也许我只是缺乏技术术语。
答案 12 :(得分:1)
我不知道ZIP是否使用了运行长度编码,但如果确实如此,这样的压缩文件将包含一小段数据和一个非常大的游程长度值。游程长度值将指定重复小数据的次数。当您的值非常大时,结果数据会成比例地大。
答案 13 :(得分:0)
硅谷第3季第7集将我带到了这里。产生拉链炸弹的步骤是。
1.zip
。n
个(例如10个)副本,并将这10个文件添加到压缩存档(例如2.zip
)。k
次。对于Python实现,请检查this。
答案 14 :(得分:0)
没有必要使用嵌套文件,您可以利用 zip 格式来覆盖数据。
https://www.bamsoftware.com/hacks/zipbomb/
“这篇文章展示了如何构建一个非递归的zip炸弹,通过在zip容器内重叠文件来实现高压缩率。“非递归”意味着它不依赖于解压器递归解包嵌套在其中的zip文件zip文件:经过一轮解压后完全展开,输出大小与输入大小成二次方增加,在zip格式的极限下达到超过2800万(10 MB → 281 TB)的压缩率。更大的扩展是可以使用 64 位扩展。该构造仅使用最常见的压缩算法 DEFLATE,并且与大多数 zip 解析器兼容。”
"使用zip格式的压缩炸弹必须应对这样一个事实,即zip解析器最常支持的压缩算法DEFLATE无法实现大于1032的压缩比。因此,zip炸弹通常依赖于递归解压,在 zip 文件中嵌套 zip 文件,以获得每层 1032 的额外因子。但该技巧仅适用于递归解压缩的实现,而大多数不适用。最著名的 zip 炸弹 42.zip 扩展到强大的 4.5 PB如果它的所有六个层都被递归解压缩,但在顶层只有 0.6 MB。像 Ellingsen 和 Cox 的那些 Zip quines,它们包含自己的副本,因此如果递归解压缩,则无限扩展,同样可以完全安全地解压缩一次。”