Как сделать бомбу на молнии? - PullRequest
125 голосов
/ 22 сентября 2009

Этот вопрос о бомбах на молнии, естественно, привел меня к странице Википедии по этой теме. В статье упоминается пример файла ZIP размером 45,1 КБ, который распаковывается до 1,3 эксабайт.

Какие принципы / методы будут использоваться для создания такого файла? На самом деле я не хочу этого делать, больше интересуюсь упрощенным объяснением понятий «как-дела-работает».

приписка

В статье упоминается 9 слоев zip-файлов, так что это не простой случай архивирования группы нулей. Почему 9, почему 10 файлов в каждом?

Ответы [ 14 ]

87 голосов
/ 22 сентября 2009

Ссылаясь на страницу Википедии:

Одним из примеров бомбы Zip является файл 45.1.zip, который был 45.1 килобайт сжатых данных, , содержащий девять слои вложенных почтовых файлов в наборах 10, каждый архив нижнего слоя содержащий 1,30-гигабайтный файл для всего 1,30 эксабайт несжатого данные.

Итак, все, что вам нужно, - это один файл объемом 1,3 ГБ, полный нулей, сжать его в ZIP-файл, сделать 10 копий, упаковать их в ZIP-файл и повторить этот процесс 9 раз.

Таким образом, вы получаете файл, который при полном распаковывании производит абсурдное количество данных, не требуя, чтобы вы начали с этого количества.

Кроме того, вложенные архивы значительно усложняют такие программы, как антивирусные программы (главная цель этих «бомб»), и отказываются распаковывать «слишком большие» архивы, поскольку до последнего уровня общий объем данных не так много, вы не «видите», насколько велики файлы на самом низком уровне, пока не достигнете этого уровня, и каждый отдельный файл не «слишком большой» - проблематично только огромное количество.

39 голосов
/ 22 сентября 2009

Создайте 1,3-эксабайтный файл из нулей.

Щелкните правой кнопкой мыши> Отправить в сжатую (zip) папку.

31 голосов
/ 22 сентября 2009

Это легко сделать под Linux, используя следующую команду:

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

Замените счет на количество килобайт, которое вы хотите сжать. В приведенном выше примере создается бомба на молнии 10 МБ (совсем немного бомбы, но показывает процесс).

Вам НЕ нужно место на жестком диске для хранения всех несжатых данных.

10 голосов
/ 22 сентября 2009

Ниже для Windows:

Из концепции безопасности Focus Focus (NSFW!) Это ZIP-файл с 16 папками, в каждой по 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 приводит к выделению 4 ГБ места на диске.

8 голосов
/ 22 сентября 2009

Серьезный ответ:

(Очень просто) Сжатие основано на обнаружении повторяющихся шаблонов, поэтому в zip-файле содержатся данные, представляющие что-то вроде

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

Очень короткий zip-файл, но огромный при его расширении.

5 голосов
/ 06 октября 2016

В статье упоминается 9 слоев zip-файлов, так что это не простой случай, когда нужно собрать несколько нулей. Почему 9, почему 10 файлов в каждом?

Во-первых, статья в Википедии в настоящее время говорит о 5 слоях по 16 файлов в каждом. Не уверен, откуда исходит несоответствие, но это не так уж важно. Реальный вопрос заключается в том, зачем в первую очередь использовать вложение.

DEFLATE, единственный обычно поддерживаемый метод сжатия для zip-файлов *, имеет максимальный коэффициент сжатия 1032. Это может быть достигнуто асимптотически для любой повторяющейся последовательности 1-3 байта. Независимо от того, что вы делаете с zip-файлом, если он использует только DEFLATE, распакованный размер будет в 1032 раза больше размера исходного zip-файла.

Таким образом, необходимо использовать вложенные zip-файлы для достижения действительно невероятных коэффициентов сжатия. Если у вас есть 2 уровня сжатия, максимальное отношение становится 1032 ^ 2 = 1065024. Для 3 это 1099104768 и так далее. Для 5 слоев, используемых в 42.zip, теоретическая максимальная степень сжатия составляет 1170572956434432. Как вы можете видеть, фактический 42.zip далек от этого уровня. Отчасти это накладные расходы на формат zip, а отчасти то, что им просто было все равно.

Если бы мне пришлось угадывать, я бы сказал, что файл 42.zip был создан путем простого создания большого пустого файла, его многократного архивирования и копирования. Не делается попытка раздвинуть границы формата или максимизировать сжатие или что-либо еще - они просто произвольно отобрали 16 копий на слой. Задача состояла в том, чтобы создать большую полезную нагрузку без особых усилий.

Примечание: другие форматы сжатия, такие как bzip2, предлагают намного, намного, намного большие максимальные коэффициенты сжатия. Однако большинство парсеров zip их не принимают.

P.S. Можно создать zip-файл, который будет распакован в свою копию (quine). Вы также можете сделать один, который разархивирует несколько копий себя. Поэтому, если вы рекурсивно разархивируете файл навсегда, максимально возможный размер будет бесконечным. Единственным ограничением является то, что он может увеличиваться максимум на 1032 за каждую итерацию.

P.P.S. На рисунке 1032 предполагается, что данные файла в zip-файле не пересекаются. Одна из особенностей формата zip-файла заключается в том, что он имеет центральный каталог, в котором перечислены файлы в архиве и смещения к данным файла. Если вы создадите несколько записей в файлах, указывающих на одни и те же данные, вы можете достичь гораздо более высоких коэффициентов сжатия даже без вложенности, но такой zip-файл может быть отклонен синтаксическими анализаторами.

5 голосов
/ 22 сентября 2009

Чтобы создать его в практической обстановке (то есть, не создавая файл exabyte 1.3 на огромном жестком диске), вам, вероятно, придется изучить формат файла на двоичном уровне и написать что-то, что переводит в то, как должен выглядеть ваш нужный файл. после сжатия.

4 голосов
/ 22 сентября 2009

Хороший способ создать zipbomb (или gzbomb) - это знать двоичный формат, на который вы ориентируетесь. В противном случае, даже если вы используете потоковый файл (например, /dev/zero), вы все равно будете ограничены вычислительной мощностью, необходимой для сжатия потока.

Хороший пример gzip-бомбы: http://selenic.com/googolplex.gz57 (после нескольких уровней сжатия в файл вложено сообщение, приводящее к огромным файлам)

Удачи, находя это сообщение:)

2 голосов
/ 17 октября 2012

попробовал. размер выходного zip-файла был небольшим - 84 КБ.

Шаги, которые я сделал до сих пор:

  1. создать 1,4-ГБ .txt-файл, полный '0'
  2. сжать его.
  3. переименуйте .zip в .txt, затем сделайте 16 копий
  4. сжать все это в файл .zip,
  5. переименуйте переименованные файлы .txt внутри .zip файла в .zip снова
  6. повторите шаги с 3 по 5 восемь раз.
  7. Наслаждайтесь:)

хотя я не знаю, как объяснить ту часть, где сжатие переименованного zip-файла все еще сжимает его в меньший размер, но это работает. Может быть, мне просто не хватает технических терминов.

2 голосов
/ 16 марта 2012

Последние (после 1995 г.) алгоритмы сжатия, такие как bz2, lzma (7-zip) и rar, обеспечивают впечатляющее сжатие монотонных файлов, и одного слоя сжатия достаточно, чтобы обернуть негабаритный контент до приемлемого размера.

Другой подход может состоять в том, чтобы создать разреженный файл экстремального размера (эксабайт), а затем сжать его чем-нибудь обыденным, который понимает разреженные файлы (например, tar), теперь, если эксперт проверяет поток файла, который экзаменатор должен будет прочитать после всех нули, которые существуют только для заполнения между фактическим содержимым файла, если экзаменатор записывает его на диск, однако будет использовано очень мало места (при условии, что хорошо ведущий себя архиватор и современная файловая система).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...