Comment fait-on une bombe Zip?

cette question sur les bombes zip m'a naturellement mené à la page Wikipédia sur le sujet. L'article mentionne un exemple de 45.1 ko fichier zip qui décompresse à 1,3 exaoctets.

Quels sont les principes/techniques qui seraient utilisés pour créer un tel fichier? Je ne veux pas vraiment faire cela, plus intéressé par une explication simplifiée "comment-stuff-fonctionne" des concepts impliqués.

p. S.

l'article mentionne 9 couches de fichiers zip, donc ce n'est pas un simple cas de fermeture éclair d'un tas de zéros. Pourquoi 9, pourquoi 10 fichiers dans chaque?

120
demandé sur Community 2009-09-22 16:04:10

14 réponses

citant la page Wikipedia:

un exemple de bombe Zip est le fichier 45.1.zip qui était de 45,1 kilo-octets de données compressées, , contenant neuf couches de fichiers zip imbriqués 10, chaque couche inférieure archive contenant un fichier de 1,30 gigaoctet pour un total de 1.30 exaoctets non compressé données.

donc tout ce que vous avez besoin est un seul fichier de 1.3 Go rempli de zéros, compresser que dans un fichier ZIP, faites 10 copies, empaquetez-les dans un fichier ZIP, et répétez ce processus 9 fois.

de cette façon, vous obtenez un fichier qui, lorsqu'il n'est pas compressé complètement, produit une quantité absurde de données sans vous obliger à commencer avec cette quantité.

de plus, les archives imbriquées rendent beaucoup plus difficile pour des programmes comme les scanners de virus (la cible principale de ces "bombes") d'être intelligent et de refuser de déballer des archives qui sont" trop grandes", parce que jusqu'à le dernier niveau la quantité totale de données n'est pas tant que cela, vous ne "voyez" pas la taille des fichiers au niveau le plus bas sont jusqu'à ce que vous avez atteint ce niveau, et chaque fichier individuel n'est pas "trop grand" - seul le nombre énorme est problématique.

84
répondu Michael Borgwardt 2009-09-22 12:28:14

créer un fichier 1.3 exaoctet de zéros.

clic droit > envoyer au dossier comprimé (zippé).

35
répondu wefwfwefwe 2009-09-22 12:07:09

cela se fait facilement sous Linux en utilisant la commande suivante:

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

remplacer le nombre par le nombre de KB que vous voulez compresser. L'exemple ci-dessus crée une bombe zip De 10MiB (pas beaucoup d'une bombe du tout, mais il montre le processus).

vous n'avez pas besoin d'espace disque pour stocker toutes les données non compressées.

28
répondu Thomi 2009-09-22 12:30:27

ci-dessous est Pour Windows:

De la Accent sur la Sécurité de la preuve de concept (NSFW!), c'est un fichier ZIP avec 16 dossiers, chacun avec 16 dossiers, qui continue comme si (42 est le nom du fichier zip):

\42\lib 0\livre 0\chapitre 0\doc 0\0.dll

...

\42\lib F \ book f\chapter f \ doc f\0.dll

j'ai probablement tort. la figure, mais il produit 4^16 (4,294,967,296) répertoires. Parce que chaque répertoire a besoin d'espace d'attribution de n octets, il finit par être énorme. Le fichier dll à la fin est 0 bytes.

décompresse le premier répertoire seul \lib 0\book 0\chapter 0\doc 0" 151900920 ".dll donne 4 Go d'espace d'allocation.

9
répondu Chris S 2009-09-22 14:03:05

réponse sérieuse:

(très fondamentalement) la Compression repose sur le repérage des motifs répétitifs, de sorte que le fichier zip contiendrait des données représentant quelque chose comme

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

fichier zip très court, mais énorme quand vous l'élargissez.

8
répondu wefwfwefwe 2009-09-22 12:18:04

pour en créer un dans un cadre pratique (i.e. sans créer un fichier exaoctet 1.3 sur vous énorme harddrive), vous auriez probablement à apprendre le format de fichier à un niveau binaire et écrire quelque chose qui se traduit par ce que votre fichier désiré ressemblerait, post-compression.

5
répondu Andy_Vulhop 2009-09-22 12:16:35

l'article mentionne 9 couches de fichiers zip, donc ce n'est pas un simple cas de fermeture éclair d'un tas de zéros. Pourquoi 9, pourquoi 10 fichiers dans chaque?

tout d'abord, L'article de Wikipedia dit actuellement 5 couches avec 16 fichiers chacune. Vous ne savez pas où la différence vient de la, mais ce n'est pas pertinente. La vraie question est pourquoi utiliser la nidification en premier lieu.

DEFLATE, la seule méthode de compression couramment prise en charge pour zip fichiers*, a un taux de compression maximum de 1032. Cela peut être réalisé asymptotiquement pour toute séquence répétée de 1-3 octets. Peu importe ce que vous faites à un fichier zip, tant qu'il est seulement en utilisant DEFLATE, la taille non empaquetée sera au plus 1032 fois la taille du fichier zip original.

par conséquent, il est nécessaire d'utiliser des fichiers zip imbriqués pour obtenir des taux de compression vraiment scandaleux. Si vous avez 2 couches de compression, le rapport maximum devient 1032^2 = 1065024. Pour 3, c'est 1099104768, et ainsi de suite. Pour les 5 couches utilisées dans 42.zip, le taux de compression maximal théorique est de 1170572956434432. Comme vous pouvez le voir, le 42.zip est loin de ce niveau. C'est en partie la surcharge du format zip, et partie, c'est que ils n'a tout simplement pas de soins.

si je devais deviner, je dirais 42.zip a été formé en créant simplement un grand fichier vide, et en le glissant et le copiant à plusieurs reprises. Il n'y a aucune tentative de repousser les limites du format ou de maximiser compression ou n'importe quoi - ils ont juste arbitrairement choisi 16 copies par couche. Le but était de créer une charge utile importante sans trop d'efforts.

Note: D'autres formats de compression, tels que bzip2, offrent des taux de compression maximum beaucoup, beaucoup, beaucoup plus grands. Cependant, la plupart des zip parsers ne les acceptent pas.

P. S. Il est possible de créer un fichier zip qui se décompose en une copie de lui-même (une quine). Vous pouvez aussi en faire un qui se décompose en plusieurs copies. Par conséquent, si vous décompressez un fichier de façon récursive pour toujours, la taille maximale possible est infinie. La seule limitation est qu'il peut augmenter d'au plus 1032 à chaque itération.

P. P.S. la figure 1032 suppose que les données du fichier dans le zip sont disjointes. Une bizarrerie du format de fichier zip est qu'il a un répertoire central qui liste les dossiers dans l'archive et les offsets aux données de dossier. Si vous créez plusieurs entrées de fichier pointant vers les mêmes données, vous pouvez obtenir beaucoup plus taux de compression même sans imbrication, mais un tel fichier zip est susceptible d'être rejeté par les parsers.

5
répondu Antimony 2016-10-06 05:00:19

une bonne façon de créer un zipbomb (ou gzbomb) est de connaître le format binaire que vous ciblez. Sinon, même si vous utilisez un fichier en streaming (par exemple en utilisant /dev/zero ), vous serez toujours limité par la puissance de calcul nécessaire pour compresser le flux.

un bel exemple de bombe gzip: http://selenic.com/googolplex.gz57 (il y a un message intégré dans le fichier après plusieurs niveaux de compression résultant en d'énormes fichiers)

Ont le plaisir de trouver ce message :)

3
répondu tonfa 2009-09-22 12:36:56

peut-être, sur unix, vous pourriez insérer un certain nombre de zéros directement dans un programme zip ou autre? Je n'en sais pas assez sur unix pour expliquer comment vous feriez ça. En dehors de cela, vous auriez besoin d'une source de zéros, et les Piper dans une fermeture à glissière qui a lu à partir de stdin ou quelque chose...

2
répondu Svish 2009-09-22 12:15:32

tous les algorithmes de compression de fichiers s'appuient sur entropie de l'information à compresser. En théorie, on peut compresser un jet de 0 ou de 1, et s'il est assez long, il se compressera très bien.

C'est la partie théorique. La partie pratique a déjà été fait par d'autres.

2
répondu Calyth 2009-09-22 12:31:18

a essayé. la taille du fichier zip de sortie était un petit fichier de 84 Ko.

Étapes que j'ai fait jusqu'à présent:

  1. créer un 1.4-GB .fichier txt plein de '0'
  2. compresse.
  3. renommer le .zip pour .txt puis faire 16 copies
  4. compresse tout en a.fichier zip,
  5. renommer le renommé .les fichiers txt à l'intérieur du .le fichier zip dans .fermeture à glissière
  6. répéter étapes 3 à 5 huit fois.
  7. Enjoy:)

bien que je ne sache pas comment expliquer la partie où la compression du fichier zip renommé comprime encore en une plus petite taille, mais il fonctionne. Peut-être que les termes techniques me manquent.

2
répondu jaycroll 2012-10-17 09:40:29

Je ne sais pas si ZIP utilise L'encodage de longueur D'exécution, mais si c'était le cas, un tel fichier compressé contiendrait un petit morceau de données et une très grande valeur de longueur d'exécution. La valeur run-length indiquerait combien de fois le petit morceau de données est répété. Lorsque vous avez une très grande valeur, les données résultantes sont proportionnellement importantes.

1
répondu Joe 2009-09-22 12:09:24

récents (post 1995) algorithmes de compression comme bz2, lzma (7-zip) et rar donnent la compression spectaculaire des fichiers monotones, et une seule couche de compression est suffisante pour envelopper le contenu surdimensionné à une taille gérable.

une autre approche pourrait être de créer un fichier clairsemé de taille extrême (exaoctets) et puis le compresser avec quelque chose de banal qui comprend les fichiers clairsemés( par exemple tar), maintenant si l'examinateur streams le fichier que l'examinateur aura besoin de lire passé tous ces zéros qui n'existent qu'entre le contenu réel du fichier, si l'examinateur l'écrit sur le disque, cependant très peu d'espace sera utilisé (en supposant un bon archiveur et un système de fichiers moderne).

1
répondu user340140 2012-03-15 21:17:29

Silicon Valley Saison 3 L'Épisode 7 m'a amené ici. Les étapes pour générer une bombe zip seraient.

  1. créez un fichier fictif avec des zéros (ou des uns si vous pensez qu'ils sont maigres) de taille (disons 1 Go).
  2. compresse ce fichier dans un fichier zip en disant 1.zip .
  3. faire n (dire 10) copies de ce fichier et ajouter ces 10 fichiers à une archive compressée (dire 2.zip ).
  4. répétez l'étape 3 k nombre de fois.
  5. vous aurez une bombe zip.

pour une implémentation Python, cochez cette .

0
répondu Abdul Fatir 2016-06-09 09:15:30