如何制作Zip炸弹?


131

有关拉链炸弹的问题自然使我进入了有关该主题的Wikipedia页面。本文提到了一个45.1 kb zip文件的示例,该文件解压缩为1.3艾字节。

首先,用于创建此类文件的原则/技术是什么?我不想真正做到这一点,而对简化的“工作原理”所涉及概念的解释更感兴趣。

ps

本文提到了9层zip文件,因此这不是将一堆零压缩的简单案例。为什么9个,为什么每个10个?


5
@Michael您的投诉无效。OP不仅询问它是如何工作的,而且在发布的文章中没有任何内容表明其明确目的是禁用反病毒。恰恰相反,本文的重点似乎是DOS风格的攻击,其中仅提到了禁用反病毒功能。
San Jacinto

2
关键在于,OP所指的是一个特定文件,该文件由嵌套档案组成,而不是一个巨大的压缩文件。
Michael Borgwardt

1
我认为Michael是对的,他解释了如何创建“ PS”中描述的文件,其他人则没有。但是,“ PS”是作为编辑添加的,因此在给出答案时,这些答案可能并不是很明显的错误。他们只是认为“这样的文件”的意思是“任何解压缩到1.3艾字节的文件”,事实证明,它的意思是“一种结构,类似于我链接到的文章中描述的文件”。
史蒂夫·杰索普

1
@onebyone我完全同意。我只是认为在这种情况下不宜采用无表决权的做法。
San Jacinto

4
我想这取决于您是否认为是低票是指“这不是问题的最佳答案”,还是“您是一个傻瓜,不值得生活”或两者之间的下落。我个人认为我应该重新阅读我的回答,看看是否有明显的错误应该解决。但是,如果我认为我的回答有所帮助,那么我现在很高兴被不同意并且不更改我的答案。而且,无论如何我对整个投票过程都毫不关心,因为很明显,我永远也不会抓到乔恩·斯凯特(
史蒂夫·杰索普

Answers:


92

从维基百科页面引用:

一个Zip炸弹的例子是45.1.zip,它是45.1 KB的压缩数据,包含9层嵌套的zip文件(每10个一组),每个底层归档文件都包含1.30 GB的文件,总计1.30 EB的未压缩数据。

因此,您所需要的只是一个充满零的1.3GB文件,将其压缩为ZIP文件,制作10个副本,将其打包为ZIP文件,然后重复此过程9次。

这样,您将获得一个文件,该文件在完全解压缩后会产生大量的数据,而无需您从该数量开始。

此外,嵌套的存档使病毒扫描程序(这些“炸弹”的主要目标)之类的程序变得更聪明,更难以解压缩“太大”的存档,因为直到最后一级为止,数据总量不会那么多,直到达到该级别,您才可以“看到”最低级别的文件,而且每个文件也不是“太大”-只有数量巨大才有问题。


2
不可能...一旦在底部压缩零文件,生成的压缩文件就不会像下一层那样具有可压缩性。
pufferfish

16
嗯,但是在每个级别上,您都有十个相同的文件-可以很好地压缩。尽管ZIP不会利用跨文件冗余,但是包含十个单独压缩的相同文件的归档文件本身可能具有很多冗余,可供下一层利用。
Michael Borgwardt

10
关键不是如何从最小的文件中生成最大数量的数据-关键是要击败病毒扫描程序防范太大档案的尝试。
Michael Borgwardt

2
这不是维基百科上文章的重点。似乎推动了DOS风格的攻击。
San Jacinto

2
但是不会递归提取文件...受害者应继续提取子zip文件以使其起作用...任何解决方法。
Manoj

46

创建一个零的1.3艾字节文件。

右键单击>发送到压缩(压缩)文件夹。


22
你忘了讽刺的“笑脸”。
tvanfosson

1
由于文件大小的限制,对于大多数文件系统和压缩算法而言,这很可能是不可能的。但是,在压缩档案中嵌套文件(如果压缩算法有总大小限制,可以在档案中放入更多嵌套档案),您可以绕过这些限制。
Blixt

133
应该使1.3艾字节的文件为1。他们比0瘦很多:)
Quinn Wilson

33
@quinn-这就是为什么压缩(最初更胖的)零点要有效得多的原因
wefwfwefwe 2009年

1
除非我没有记错,否则这会为您提供> 1gb的zip文件
Chris S

36

在Linux下,使用以下命令可以轻松完成此操作:

dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -

将count替换为您要压缩的KB数。上面的示例创建了一个10MiB zip炸弹(一点也不炸弹,但显示了该过程)。

您不需要硬盘空间来存储所有未压缩的数据。


8
但是,你需要的计算能力来压缩未压缩数据,它仍然为O(n)的大小非压缩数据。
tonfa

2
是的,这里的所有其他答案也一样。
Thomi

6
Michael Borgwardt的答案是未压缩数据的大小为O(log N)。
史蒂夫·杰索普

1
大概吧。该过程的每个重复“剥离存档头,复制压缩文件条目10次,替换存档头,压缩”,将zip嵌套级别提高1,所花费的时间与上一步中压缩数据的大小成比例,将未压缩数据的大小乘以10,如果它完全增加了压缩数据的大小,则肯定不会像线性因子那样增加。
史蒂夫·杰索普

3
因此,作为测试,我将-9压缩到1.3 GB的零。结果是一个1.3M文件。我重复了10次(不会被zip标题弄乱,所以结果不会像zip炸弹一样工作,但是说明了原理)给出了一个13M的文件,并以-9压缩为34381字节。因此,复制步骤实际上使文件更小,因为deflate仅支持特定最大大小的令牌。下一步的结果18453,然后19012,19312,19743,20120,20531,20870.
史蒂夫杰索普

10

以下是针对Windows的:

从“ 安全焦点”概念证明(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的分配空间。


27
我只是假设他们是做安全研究的裸女。
詹姆斯·麦克马洪

3
邮编是nsfw。一个大的红色紧急警报响起,笼子将从桌子周围的天花板上掉下来
Chris S

4
如果对病毒文件的每次点击都会导致对人力资源部门的采访,那么您要么不需要病毒扫描程序,要么就不需要人力资源部门。其中之一对业务没有贡献;-)
史蒂夫·杰索普

2
也可能是NSFW,因为网络病毒扫描程序可能希望对其进行检查-并将其提取以进行检查。
迈克尔·斯托姆

5
病毒扫描程序应仅将其标记为可疑(这可能导致它被安全地阻止,或者可能导致不安全地报告您尝试安装病毒)。如果炸弹确实爆炸了,那么您的IT部门就会学到一些有价值的东西-他们需要更好的病毒扫描程序。
Steve Jessop

8

认真的答案:

(基本上),压缩取决于发现重复模式,因此zip文件将包含表示类似

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)

压缩文件非常短,但展开时会很大。


1
确实可以进一步压缩:0x1(0x35)(也就是说,第二个0重复了35次,因此将扩展为您的评论)
Michael

5

要在实际设置中创建一个文件(即,无需在巨大的硬盘驱动器上创建1.3艾字节的文件),您可能必须学习二进制级别的文件格式,并编写一些内容,将其转换为所需的文件后,压缩。


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)提供了非常大得多的最大压缩率。但是,大多数zip解析器都不接受它们。

PS可以创建一个zip文件,该文件将解压缩到其自身的副本(一个quine)。您也可以制作一个可解压缩到其自身多个副本的文件。因此,如果永久递归地解压缩文件,则最大可能的大小是无限的。唯一的限制是每次迭代最多可以增加1032。

PPS 1032数字假定zip中的文件数据是不相交的。zip文件格式的一个怪癖是它具有一个中央目录,该目录列出了存档中的文件并偏移了文件数据。如果创建指向相同数据的多个文件条目,即使没有嵌套,也可以实现更高的压缩率,但是这样的zip文件很可能会被解析器拒绝。


4

创建zipbomb(或gzbomb)的一种好方法是知道您要定位的二进制格式。否则,即使您使用流式传输文件(例如使用/dev/zero),仍然会受到压缩流所需的计算能力的限制。

一个gzip炸弹的好例子:http : //selenic.com/googolplex.gz57(在经过多级压缩后,文件中嵌入了一条消息,导致文件很大)

开心找到该消息:)


2

也许在UNIX上,您可以将一定数量的零直接传送到zip程序之类的东西中?对UNIX的了解不足以解释您将如何做。除此之外,您还需要一个零源,并将它们输送到一个从stdin或其他东西读取的拉链中。


因无视实际问题而question之以鼻,因为它提到了一个特定文件,该文件显然不是压缩一大堆零的结果。
Michael Borgwardt

不,您仍然会受到计算能力的限制。理想情况下,您不想运行gzip / zip,因为它将使用大量CPU(或者至少O(n)n是解压缩文件的大小)
tonfa

@tonfa:好吧,当然,您会受到计算能力的限制。我的理由是,您可能不想在光盘上创建EB级大文件,然后对其进行压缩...
Svish

2

所有文件压缩算法都依赖于要压缩的信息的。从理论上讲,您可以压缩0或1的流,并且如果它足够长,它将很好地压缩。

这就是理论部分。其他人已经指出了实际部分。


2

最近(1995年后)的压缩算法(如bz2,lzma(7-zip)和rar)对单调文件进行了惊人的压缩,单层压缩足以将超大内容包装为可管理的大小。

另一种方法可能是创建一个极小的大小(艾字节)的稀疏文件,然后使用能理解稀疏文件的普通东西(例如tar)对其进行压缩,现在,如果检查者对文件进行流式处理,则检查者将需要读取所有存在的那些零。如果检查员将其写入磁盘,则只能在文件的实际内容之间填充,但是将使用很少的空间(假设行为良好的未存档程序和现代文件系统)。


2

试了一下。输出的zip文件大小为84 KB的小文件。

我到目前为止所做的步骤:

  1. 创建一个1.4 GB的.txt文件,该文件完整为“ 0”
  2. 压缩它。
  3. 将.zip重命名为.txt,然后制作16个副本
  4. 将其全部压缩为.zip文件,
  5. 再次将.zip文件中重命名的.txt文件重命名为.zip
  6. 重复步骤3至5八次。
  7. 请享用 :)

虽然我不知道如何解释重命名zip文件的压缩仍然将其压缩为较小尺寸的部分,但是它可以工作。也许我只是缺乏技术术语。


顺便说一句,不要担心它将不断提取其中的所有zip文件。它仅提取嵌套在其下的zip文件,而不是提取到底部的所有压缩文件。
jaycroll 2012年

2

硅谷第3季第7集将我带到这里。生成拉链炸弹的步骤将是。

  1. 创建一个虚拟文件,其大小为零(例如1 GB)(如果您认为它们很薄,则为零)。
  2. 将此文件压缩为zip文件say 1.zip
  3. 制作n(例如10个)该文件的副本,并将这10个文件添加到压缩档案中(例如2.zip)。
  4. 重复步骤3 k的次数。
  5. 您会得到一个拉链炸弹。

对于Python实现,请检查this


1

我不知道ZIP是否使用运行长度编码,但是如果这样做,那么这样的压缩文件将包含一小部分数据和非常大的运行长度值。游程长度值将指定将一小段数据重复多少次。当值很大时,结果数据将成比例地大。


2
ZIP使用有效地标记数据的Lempel-Ziv-Welch(或其修改版本)压缩。长期使用“字节”集将导致良好的压缩效果,因此,为什么GIF(也使用LZW)对图形好,而JPEG(使用复杂的正弦波压缩)对数据更“随机”的照片更好呢? '。
拉撒路
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.