怎么制作拉链炸弹?

puf*_*ish 126 compression algorithm

关于拉链炸弹的这个问题自然导致我进入关于该主题的维基百科页面.文章提到了一个45.1 kb的zip文件解压缩到1.3艾字节的例子.

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

PS

文章提到了9层zip文件,所以这不是一个简单的拉链串零的情况.为什么9,为什么每个10个文件?

Mic*_*rdt 89

引用维基百科页面:

Zip炸弹的一个例子是文件45.1.zip,它是45.1千字节的压缩数据,包含9层嵌套的zip文件,每组10个,每个底层存档包含1.30千兆字节的文件,总共1.30艾字节的未压缩数据.

所以你需要的只是一个装满零的1.3GB文件,将其压缩成ZIP文件,制作10份,将其打包成ZIP文件,然后重复这个过程9次.

通过这种方式,您可以获得一个文件,当完全未压缩时,会产生大量数据,而不需要您开始使用该数量.

此外,嵌套存档使得像病毒扫描程序(这些"炸弹"的主要目标)这样的程序更加智能并且拒绝解压缩"太大"的存档更加困难,因为直到最后一级数据的总量是不是那么多,你没有"看到"最低级别的文件有多大,直到你达到那个级别,并且每个单独的文件不是"太大" - 只有大数字是有问题的.

  • 啊,但在每个级别,你有十个*相同的*文件 - 再次压缩很好.虽然ZIP不利用跨文件冗余,但是包含10个单独压缩的相同文件的存档本身可能具有大量冗余,以供下一层利用. (16认同)
  • 关键不在于如何从尽可能小的文件中生成最大数量的数据 - 重点是打败病毒扫描程序试图防范过大的档案. (10认同)
  • 不可能......一旦你在底部压缩零文件,生成的压缩文件就不会像下一层那样可压缩. (2认同)
  • 这不是维基百科上文章的主旨.它似乎推动了DOS风格的攻击. (2认同)
  • 但文件不会被递归提取...受害者应继续提取子zip文件以使其工作......任何解决方法. (2认同)

wef*_*fwe 43

创建一个1.3 exabyte的零文件.

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

  • 应该制作1.3 exabyte文件的1.他们比0更瘦!:) (131认同)
  • @quinn - 这就是为什么压缩(初始更胖)零更有效 (33认同)
  • 你忘记了讽刺的"笑脸". (22认同)
  • 这会给你一个 > 1gb 的 zip 文件,除非我弄错了 (2认同)

Tho*_*omi 35

这可以在Linux下使用以下命令轻松完成:

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

将count替换为要压缩的KB数.上面的例子创建了一个10MiB拉链炸弹(根本没有炸弹,但它显示了这个过程).

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

  • 但是你需要*压缩未压缩数据的计算能力,它仍然是*未压缩*数据大小的O(n). (8认同)
  • Michael Borgwardt的答案是未压缩数据大小的O(log N). (6认同)
  • 所以就像测试一样,我压缩-9 1.3 GB的零.结果是一个1.3M的文件.我复制了这10次(不能打扰使用zip标题,因此结果不能用作拉链炸弹,但说明原理)给出一个13M文件,压缩zip -9到34381字节.因此复制步骤实际上使文件更小,因为deflate仅支持特定最大大小的令牌.下一步结果是18453,然后是19012,19312,19743,20120,20531,20870. (3认同)
  • 是的,就像这里的所有其他答案一样. (2认同)

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的分配空间.

  • 我只是假设他们是裸体女士进行安全研究. (26认同)
  • 病毒扫描程序应该将其标记为可疑(这可能会导致它被安全阻止,或者可能导致您不安全地报告尝试安装病毒).如果炸弹实际爆炸,那么你的IT部门已经学到了一些有价值的东西 - 他们需要更好的病毒扫描程序. (5认同)
  • 如果病毒文件的每次命中都会导致对HR的访问,那么您不需要病毒扫描程序,否则您不需要人力资源部门.其中一个没有为业务做出贡献;-) (4认同)
  • 邮编是nsfw.一个大的恐慌红色警报会响起,一个笼子会从桌子周围的天花板上掉下来 (3认同)
  • 也可能是NSFW,因为网络病毒扫描程序可能想检查它 - 并提取它来执行此操作. (2认同)

wef*_*fwe 8

认真的回答:

(非常基本)压缩依赖于发现重复模式,因此zip文件将包含表示类似的数据

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)
Run Code Online (Sandbox Code Playgroud)

非常短的zip文件,但扩展它时会很大.


And*_*hop 5

要在实际环境中创建一个(即不在您的巨大硬盘上创建1.3 exabyte文件),您可能必须在二进制级别学习文件格式并编写一些内容,转换为您想要的文件的样子,后压缩.


Ant*_*ony 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文件.