Mic*_*rdt 89
引用维基百科页面:
Zip炸弹的一个例子是文件45.1.zip,它是45.1千字节的压缩数据,包含9层嵌套的zip文件,每组10个,每个底层存档包含1.30千兆字节的文件,总共1.30艾字节的未压缩数据.
所以你需要的只是一个装满零的1.3GB文件,将其压缩成ZIP文件,制作10份,将其打包成ZIP文件,然后重复这个过程9次.
通过这种方式,您可以获得一个文件,当完全未压缩时,会产生大量数据,而不需要您开始使用该数量.
此外,嵌套存档使得像病毒扫描程序(这些"炸弹"的主要目标)这样的程序更加智能并且拒绝解压缩"太大"的存档更加困难,因为直到最后一级数据的总量是不是那么多,你没有"看到"最低级别的文件有多大,直到你达到那个级别,并且每个单独的文件不是"太大" - 只有大数字是有问题的.
wef*_*fwe 43
创建一个1.3 exabyte的零文件.
右键单击>发送到压缩(zipped)文件夹.
Tho*_*omi 35
这可以在Linux下使用以下命令轻松完成:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
将count替换为要压缩的KB数.上面的例子创建了一个10MiB拉链炸弹(根本没有炸弹,但它显示了这个过程).
您不需要硬盘空间来存储所有未压缩的数据.
Chr*_*s S 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的分配空间.
认真的回答:
(非常基本)压缩依赖于发现重复模式,因此zip文件将包含表示类似的数据
0x100000000000000000000000000000000000
(Repeat this '0' ten trillion times)
Run Code Online (Sandbox Code Playgroud)
非常短的zip文件,但扩展它时会很大.
文章提到了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文件.