Як можна зробити бомбу на Zip?


131

Це питання про поштові бомби, природно, привело мене до сторінки Вікіпедії на цю тему. У статті згадується приклад zip-файлу потужністю 45,1 кб, який розпаковується до 1,3 екзабайтів.

Які принципи / прийоми використовуються для створення такого файлу в першу чергу? Насправді я не хочу цього робити, більше зацікавлений у спрощеному поясненні поняття "як працює".

пс

У статті згадується 9 шарів поштових файлів, тож це не простий випадок зшивання купи нулів. Чому 9, чому 10 файлів у кожному?


5
@Michael Ваша скарга недійсна. ОП не тільки запитало, як це працює, ніщо в опублікованій статті не говорить про те, що це призначено прямо для відключення антивірусу. Зовсім навпаки, здається, що поштовх статті - це атака в стилі DOS, лише минула згадка про відключення антивірусу.
Сан-Хасінто

2
Справа в тому, що ОП мав на увазі конкретний файл, який складається з вкладених архівів, а не одного величезного стислого файлу.
Майкл Боргвардт

1
Я думаю, що Майкл має рацію, він пояснює, як створити файл, описаний у "PS", а всі інші ні. Однак "PS" було додано як редагування, тому ці відповіді, можливо, не були явно помилковими на той момент, коли вони були надані. Вони просто подумали, що "такий файл" означає "будь-який файл, який розкладається до 1,3 екбабайта", коли виявляється, він мав на увазі "файл, структурований як той, що описаний у статті, на яку я посилаюся".
Стів Джессоп

1
@onebyone Я повністю згоден. Я просто не вважаю, що за таких обставин доречна дорога.
Сан-Хасінто

4
Я думаю, це залежить від того, чи вважаєте ви, що це означає, що це означає "це не найкраща відповідь на питання", або "ви дурень і не гідний жити", або де знаходитесь між ними. Особисто я вважаю, що я повинен перечитати свою відповідь і побачити, чи є щось явно не в цьому, що я повинен виправити. Але тоді я досить радий, що зараз не погоджуюсь і не змінюю свою відповідь, якщо я думаю, що моя відповідь щось сприяє. І я все-таки став досить незаклопотаним щодо всього процесу голосування, тепер, коли зрозуміло, що я ніколи не спіймаю Джона Скіта ;-)
Стів Джессоп

Відповіді:


92

Посилаючись на сторінку Вікіпедії:

Одним із прикладів Zip-бомби є файл 45.1.zip, який склав 45,1 кілобайт стислих даних, що містить дев'ять шарів вкладених zip-файлів у наборах по 10, кожен архів нижнього шару, що містить файл 1,30 гігабайт, на загальну суму 1,30 екбабайтів нестиснених даних .

Отже, все, що вам потрібно, - це один єдиний 1,3 ГБ файл з нулями, стисніть його в ZIP-файл, зробіть 10 копій, запакуйте їх у ZIP-файл і повторіть цей процес 9 разів.

Таким чином, ви отримуєте файл, який, коли не стиснений повністю, видає абсурдний обсяг даних, не вимагаючи від вас починати з цього обсягу.

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


2
Не може бути ... щойно ви стискаєте файл нулів у нижній частині, отриманий файл-блискавка не буде майже таким же стисливим для наступного шару.
pufferfish

16
Ах, але на кожному рівні у вас є десять однакових файлів - що знову добре стискає. Хоча ZIP не використовує перехресні файли, але в архіві, що містить десять індивідуально стислих однакових файлів, ймовірно, є багато надмірності для наступного шару для використання.
Майкл Боргвардт

10
Справа НЕ в тому, як генерувати максимальну кількість даних з найменшого можливого файлу - справа в тому, що перемагають спроби вірусних сканерів захистити від занадто великих архівів.
Майкл Боргвардт

2
Це не суть статті у Вікіпедії. Схоже, штовхає атака в стилі DOS.
Сан-Хасінто,

2
Але файли не витягуються рекурсивно ... жертва повинна продовжувати витягувати файли sub zip, щоб вона працювала ... Будь-яка робота з цього приводу.
Маной

46

Створіть 1,3 екзабайтовий файл нулів.

Клацніть правою кнопкою миші> Надіслати в стиснуту (на блискавку) папку.


22
Ви забули сарказм «смайлик».
tvanfosson

1
Це, швидше за все, неможливо для більшості файлових систем та алгоритмів стиснення через обмеження розміру файлу. Однак вкладення файлів у стислий архів (та розміщення ще більше вкладених архівів в архів, якщо алгоритм стиснення має обмеження загального розміру) дозволяє обійти ці межі.
Blixt

133
має зробити 1,3 екзабайтовий файл 1-х. Вони набагато худіші за 0:
Куінн Вілсон,

33
@quinn - ось чому стиснення (первісно товстіших) нулів набагато ефективніше
wefwfwefwe

1
Це дає вам zip-файл> 1 Гб, якщо я не помиляюся
Chris S

36

Це легко зробити в Linux за допомогою наступної команди:

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

Замініть рахунок на кількість КБ, які потрібно стиснути. Наведений вище приклад створює поштову бомбу 10MiB (зовсім не бомба, але це показує процес).

Вам не потрібно місця на жорсткому диску для зберігання всіх нестиснених даних.


8
Але вам потрібна обчислювальна потужність для стиснення нестиснених даних, це все одно O (n) розміром нестиснених даних.
tonfa

2
Так, як і всі інші відповіді тут.
Томі

6
Відповідь Майкла Боргвардта - O (log N) розміром нестиснених даних.
Стів Джессоп

1
Приблизно, все одно. Кожне повторення процесу "знімають заголовки архіву, дублюють запис стисненого файлу 10 разів, замінюють заголовки архіву, стискають" збільшує рівень вкладення ZIP на 1, займає час, пропорційний розміру стислих даних з попереднього кроку , помножує розмір нестиснених даних на 10, і якщо він взагалі збільшує розмір стислих даних, звичайно, це не робить нічого, як лінійний коефіцієнт.
Стів Джессоп

3
Тому я просто тестую -9 1,3 ГБ нулів. Результат - файл 1.3M. Я дублював це 10 разів (не могло заважати возитися з zip-заголовками, тому результат не буде працювати як zip-бомба, але ілюструє принцип), щоб дати 13M-файл, який стискає zip -9 до 34381 байт. Таким чином, крок дублювання насправді робить файл меншим, оскільки дефляція підтримує лише лексеми певного максимального розміру. Наступний крок результати в 18453, потім 19012, 19312, 19743, 20120, 20531, 20870.
Стів Джессоп

10

Нижче для Windows:

З підтвердження концепції "Фокус безпеки" (NSFW!), Це файл ZIP з 16 папками, у кожній з 16 папками, який триває так (42 - це zip-файл):

\ 42 \ lib 0 \ книга 0 \ глава 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ книга F \ глава 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 Гб простору розподілу.


27
Я просто припустив, що їх голі дами робили дослідження безпеки.
Джеймс Макмахон

3
Поштовий індекс був nsfw. Велика панічна червона тривога згасне, і клітка впаде зі стелі навколо вашого столу
Chris S

4
Якщо кожне потрапляння на вірусний файл призводить до інтерв'ю HR, то або сканер вірусів вам не потрібен, або ж вам не потрібен відділ HR. Один з них не сприяє бізнесу ;-)
Стів Джессоп,

2
Може бути і NSFW, оскільки сканер мережевих вірусів, можливо, захоче перевірити його - і витягнути це для цього.
Майкл Штум

5
Сканер вірусів повинен просто позначати його підозрілим (що може призвести до безпечного його блокування або до небезпечного повідомлення про вас за спробу встановлення вірусів). Якщо бомба насправді вибухає, то ваш ІТ-відділ дізнався щось цінне - їм потрібен кращий сканер вірусів.
Стів Джессоп

8

Серйозна відповідь:

(Дуже в основному) Стиснення покладається на виявлення повторюваних шаблонів, тому zip-файл міститиме дані, що представляють щось подібне

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

Дуже короткий zip-файл, але величезний при його розгортанні.


1
Це може бути стиснене ще більше, насправді: 0x1 (0x35) (тобто другий 0 повторюється 35 разів, щоб він розширився до вашого коментаря)
Майкл

5

Щоб створити його в практичній обстановці (тобто без створення 1,3 екзабайтного файлу на вашому величезному жорсткому диску), вам, ймовірно, доведеться вивчити формат файлу на двійковому рівні і написати щось, що відповідає тому, як виглядатиме бажаний файл, стиснення.


5

У статті згадується 9 шарів поштових файлів, тож це не простий випадок зшивання купи нулів. Чому 9, чому 10 файлів у кожному?

По-перше, стаття Вікіпедії наразі говорить про 5 шарів з 16 файлами в кожному. Не впевнений, звідки походить розбіжність, але це не все так актуально. Справжнє питання - чому в першу чергу використовувати гніздування.

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

Тому потрібно використовувати вкладені zip-файли, щоб досягти справді нецензурних коефіцієнтів стиснення. Якщо у вас є 2 шари стиснення, максимальне співвідношення стає 1032 ^ 2 = 1065024. Для 3 це 1099104768 тощо. Для 5 шарів, які використовуються в 42.zip, максимальний теоретичний коефіцієнт стиснення становить 1170572956434432. Як ви бачите, фактичний 42.zip далеко не той рівень. Частина цього - накладні витрати формату zip, а частина - те, що вони просто не хвилюються.

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

Примітка. Інші формати стиснення, такі як bzip2, пропонують набагато, набагато і набагато більші коефіцієнти стиснення. Однак більшість аналізаторів ZIP не приймає їх.

PS Можна створити zip-файл, який розпакує копію самої себе (квинку). Ви також можете зробити той, який розпаковує до кількох копій. Тому, якщо ви рекрусивно розпаковуєте файл назавжди, максимально можливий розмір нескінченний. Єдине обмеження полягає в тому, що воно може збільшуватися щонайбільше до 1032 за кожну ітерацію.

PPS Малюнок 1032 передбачає, що дані файлу на блискавці є суперечливими. Одним із притаманних форматів zip-файлів є те, що він має центральний каталог, який перераховує файли в архіві та компенсує дані файлу. Якщо ви створюєте кілька записів файлів, що вказують на одні і ті ж дані, ви можете досягти набагато вищих коефіцієнтів стиснення навіть без введення, але такий zip-файл, ймовірно, буде відхилений парсерами.


4

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

Гарний приклад бомби gzip: http://selenic.com/googolplex.gz57 (у файл вбудоване повідомлення після декількох рівнів стиснення, що призводить до величезних файлів)

Приємно знайдіть це повідомлення :)


2

Можливо, на unix ви можете передавати певну кількість нулів безпосередньо в програму zip чи щось таке? Не знаєте достатньо Unix, щоб пояснити, як ви це зробите, хоча. Крім того, вам знадобиться джерело нулів, і вставте їх у блискавку, яка читається зі stdin чи щось таке ...


Запропоновано ігнорувати власне питання, в якому згадується конкретний файл, який явно не є результатом застібання одного великого потоку нулів.
Майкл Боргвардт

Ні, ви все одно будете обмежені обчислювальною потужністю. В ідеалі ви не хочете запускати gzip / zip, оскільки він буде використовувати багато процесора (або принаймні O (n) n має розмір декомпресованого файлу)
tonfa

@tonfa: Ну, звичайно, вас обмежать обчислювальні потужності. Мої міркування полягали в тому, що ви, можливо, не хочете створити великий екзабайтовий файл на своєму диску, а потім застебніть це ...
Svish

2

Усі алгоритми стиснення файлів покладаються на ентропію інформації, що підлягає стисненню. Теоретично ви можете стиснути потік 0 або 1, і якщо він досить довгий, він буде стискатися дуже добре.

Це частина теорії. Практичну частину вже вказали інші.


2

Останні (після 1995 р.) Алгоритми стиснення, такі як bz2, lzma (7-zip) та rar, дають ефектне стиснення монотонних файлів, і одного шару стиснення достатньо для обертання негабаритного вмісту до керованого розміру.

Іншим підходом може бути створення розрідженого файлу надзвичайного розміру (екзабайтів), а потім стиснення його з чимось приземленим, що розуміє розріджені файли (наприклад, смола), тепер, якщо екзаменатору передається файл, екзаменатору потрібно буде прочитати всі ці нулі, що існують тільки для прокладки між фактичним вмістом файлу, якщо екзаменатор записує його на диск, проте буде використано дуже мало місця (якщо припустити, що добре поводиться неархіватор і сучасна файлова система).


2

Спробував це. розмір вихідного zip-файлу становив невеликий 84-KB файл.

Поки що я зробив:

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

хоча я не знаю, як пояснити ту частину, де стискання перейменованого zip-файла все ще стискає його на менший розмір, але він працює. Можливо, мені просто відсутні технічні умови.


До речі, не бійтеся, що він буде постійно витягувати всі поштові файли всередині нього. Він витягує лише zip-файл, який вкладений під ним, а не до кінця.
jaycroll

2

Силіконова долина, 3 сезон, серія 7 привела мене сюди. Кроки для створення поштової бомби були б.

  1. Створіть фіктивний файл із нулями (або тими, якщо ви думаєте, що вони худі) розміром (скажімо, 1 ГБ).
  2. Стисніть цей файл до zip-файла скажімо 1.zip.
  3. Зробіть n(скажімо, 10) копії цього файлу та додайте ці 10 файлів до стислого архіву (скажімо2.zip ).
  4. Повторіть крок 3 kкількість разів.
  5. Ви отримаєте блискавку.

Для реалізації Python перевірте це .


1

Я не знаю, чи ZIP використовує запуск кодування довжини, але якби це було, такий стислий файл містив би невеликий фрагмент даних та дуже велике значення довжини пробігу. Значення довжини виконання визначає, скільки разів повторюється невеликий фрагмент даних. Коли у вас дуже велике значення, отримані дані пропорційно великі.


2
ZIP використовує стиснення Lempel-Ziv-Welch (або модифіковану версію), що ефективно токенізує дані. Довгі пробіги "наборів" байтів призведуть до хорошої компресії, отже, чому GIF (який також використовує LZW) хороший для графіки, а JPEG (який використовує складну синусоїдальну компресію) краще для фотографій, де дані набагато більше "випадкових" '.
Лазар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.