有关拉链炸弹的问题自然使我进入了有关该主题的Wikipedia页面。本文提到了一个45.1 kb zip文件的示例,该文件解压缩为1.3艾字节。
首先,用于创建此类文件的原则/技术是什么?我不想真正做到这一点,而对简化的“工作原理”所涉及概念的解释更感兴趣。
ps
本文提到了9层zip文件,因此这不是将一堆零压缩的简单案例。为什么9个,为什么每个10个?
有关拉链炸弹的问题自然使我进入了有关该主题的Wikipedia页面。本文提到了一个45.1 kb zip文件的示例,该文件解压缩为1.3艾字节。
首先,用于创建此类文件的原则/技术是什么?我不想真正做到这一点,而对简化的“工作原理”所涉及概念的解释更感兴趣。
ps
本文提到了9层zip文件,因此这不是将一堆零压缩的简单案例。为什么9个,为什么每个10个?
Answers:
从维基百科页面引用:
一个Zip炸弹的例子是45.1.zip,它是45.1 KB的压缩数据,包含9层嵌套的zip文件(每10个一组),每个底层归档文件都包含1.30 GB的文件,总计1.30 EB的未压缩数据。
因此,您所需要的只是一个充满零的1.3GB文件,将其压缩为ZIP文件,制作10个副本,将其打包为ZIP文件,然后重复此过程9次。
这样,您将获得一个文件,该文件在完全解压缩后会产生大量的数据,而无需您从该数量开始。
此外,嵌套的存档使病毒扫描程序(这些“炸弹”的主要目标)之类的程序变得更聪明,更难以解压缩“太大”的存档,因为直到最后一级为止,数据总量不会那么多,直到达到该级别,您才可以“看到”最低级别的文件,而且每个文件也不是“太大”-只有数量巨大才有问题。
创建一个零的1.3艾字节文件。
右键单击>发送到压缩(压缩)文件夹。
在Linux下,使用以下命令可以轻松完成此操作:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
将count替换为您要压缩的KB数。上面的示例创建了一个10MiB zip炸弹(一点也不炸弹,但显示了该过程)。
您不需要硬盘空间来存储所有未压缩的数据。
以下是针对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的分配空间。
认真的答案:
(基本上),压缩取决于发现重复模式,因此zip文件将包含表示类似
0x100000000000000000000000000000000000
(Repeat this '0' ten trillion times)
压缩文件非常短,但展开时会很大。
要在实际设置中创建一个文件(即,无需在巨大的硬盘驱动器上创建1.3艾字节的文件),您可能必须学习二进制级别的文件格式,并编写一些内容,将其转换为所需的文件后,压缩。
本文提到了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文件很可能会被解析器拒绝。
创建zipbomb(或gzbomb)的一种好方法是知道您要定位的二进制格式。否则,即使您使用流式传输文件(例如使用/dev/zero
),仍然会受到压缩流所需的计算能力的限制。
一个gzip炸弹的好例子:http : //selenic.com/googolplex.gz57(在经过多级压缩后,文件中嵌入了一条消息,导致文件很大)
开心找到该消息:)
也许在UNIX上,您可以将一定数量的零直接传送到zip程序之类的东西中?对UNIX的了解不足以解释您将如何做。除此之外,您还需要一个零源,并将它们输送到一个从stdin或其他东西读取的拉链中。
试了一下。输出的zip文件大小为84 KB的小文件。
我到目前为止所做的步骤:
虽然我不知道如何解释重命名zip文件的压缩仍然将其压缩为较小尺寸的部分,但是它可以工作。也许我只是缺乏技术术语。
硅谷第3季第7集将我带到这里。生成拉链炸弹的步骤将是。
1.zip
。n
(例如10个)该文件的副本,并将这10个文件添加到压缩档案中(例如2.zip
)。k
的次数。对于Python实现,请检查this。