Diese Frage zu Zip-Bomben führte mich natürlich zur Wikipedia-Seite zum Thema. Der Artikel erwähnt ein Beispiel für eine 45,1-KB-Zip-Datei, die auf 1,3 Exabyte dekomprimiert wird.
Welche Prinzipien / Techniken würden verwendet, um eine solche Datei überhaupt zu erstellen? Ich möchte dies nicht wirklich tun, sondern mich mehr für eine vereinfachte Erklärung der Konzepte interessieren.
ps
Der Artikel erwähnt 9 Ebenen von Zip-Dateien, daher ist es nicht einfach, eine Reihe von Nullen zu komprimieren. Warum 9, warum 10 Dateien in jeder?
algorithm
compression
Kugelfisch
quelle
quelle
Antworten:
Zitieren von der Wikipedia-Seite:
Sie benötigen also nur eine einzige 1,3-GB-Datei voller Nullen, komprimieren diese in eine ZIP-Datei, erstellen 10 Kopien, packen diese in eine ZIP-Datei und wiederholen diesen Vorgang 9 Mal.
Auf diese Weise erhalten Sie eine Datei, die, wenn sie vollständig dekomprimiert ist, eine absurde Datenmenge erzeugt, ohne dass Sie mit dieser Menge beginnen müssen.
Darüber hinaus erschweren die verschachtelten Archive es Programmen wie Virenscannern (dem Hauptziel dieser "Bomben"), intelligent zu sein und sich zu weigern, "zu große" Archive zu entpacken, da bis zur letzten Ebene die Gesamtdatenmenge beträgt nicht so viel, Sie "sehen" nicht, wie groß die Dateien auf der niedrigsten Ebene sind, bis Sie diese Ebene erreicht haben, und jede einzelne Datei ist nicht "zu groß" - nur die große Anzahl ist problematisch.
quelle
Erstellen Sie eine 1,3-Exabyte-Datei mit Nullen.
Klicken Sie mit der rechten Maustaste> An komprimierten (komprimierten) Ordner senden.
quelle
Dies ist unter Linux mit dem folgenden Befehl einfach möglich:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
Ersetzen Sie die Anzahl durch die Anzahl der KB, die Sie komprimieren möchten. Im obigen Beispiel wird eine 10-MB-Zip-Bombe erstellt (überhaupt keine große Bombe, aber sie zeigt den Vorgang).
Sie benötigen KEINEN Festplattenspeicher, um alle nicht komprimierten Daten zu speichern.
quelle
Unten ist für Windows:
Nach dem Security Focus Proof of Concept (NSFW!) Handelt es sich um eine ZIP-Datei mit 16 Ordnern mit jeweils 16 Ordnern, die so weitergeht (42 ist der Name der Zip-Datei):
Ich bin wahrscheinlich falsch mit dieser Zahl, aber sie erzeugt 4 ^ 16 (4.294.967.296) Verzeichnisse. Da jedes Verzeichnis einen Zuordnungsraum von N Bytes benötigt, ist es sehr groß. Die DLL-Datei am Ende ist 0 Bytes.
Das Entpacken des ersten Verzeichnisses allein
\42\lib 0\book 0\chapter 0\doc 0\0.dll
führt zu 4 GB Zuordnungsspeicherplatz.quelle
Ernsthafte Antwort:
(Im Grunde genommen) Die Komprimierung basiert auf dem Erkennen sich wiederholender Muster, sodass die Zip-Datei Daten enthält, die so etwas wie darstellen
Sehr kurze Zip-Datei, aber riesig, wenn Sie sie erweitern.
quelle
Um eine in einer praktischen Umgebung zu erstellen (dh ohne eine 1,3-Exabyte-Datei auf Ihrer riesigen Festplatte zu erstellen), müssten Sie wahrscheinlich das Dateiformat auf Binärebene lernen und etwas schreiben, das übersetzt, wie Ihre gewünschte Datei aussehen würde, post- Kompression.
quelle
Zunächst einmal sagt der Wikipedia-Artikel derzeit 5 Ebenen mit jeweils 16 Dateien. Ich bin mir nicht sicher, woher die Diskrepanz kommt, aber es ist nicht so relevant. Die eigentliche Frage ist, warum überhaupt die Verschachtelung verwendet wird.
DEFLATE, die einzige allgemein unterstützte Komprimierungsmethode für Zip-Dateien *, hat ein maximales Komprimierungsverhältnis von 1032. Dies kann asymptotisch für jede sich wiederholende Sequenz von 1-3 Bytes erreicht werden. Unabhängig davon, was Sie mit einer Zip-Datei tun, solange sie nur DEFLATE verwendet, beträgt die entpackte Größe höchstens das 1032-fache der Größe der ursprünglichen Zip-Datei.
Daher ist es notwendig, verschachtelte Zip-Dateien zu verwenden, um wirklich unverschämte Komprimierungsverhältnisse zu erzielen. Wenn Sie zwei Komprimierungsschichten haben, beträgt das maximale Verhältnis 1032 ^ 2 = 1065024. Für 3 ist es 1099104768 und so weiter. Für die 5 in 42.zip verwendeten Ebenen beträgt das theoretische maximale Komprimierungsverhältnis 1170572956434432. Wie Sie sehen können, ist das tatsächliche 42.zip weit von dieser Stufe entfernt. Ein Teil davon ist der Overhead des Zip-Formats, und ein Teil davon ist, dass es ihnen einfach egal war.
Wenn ich raten müsste, würde ich sagen, dass 42.zip gebildet wurde, indem einfach eine große leere Datei erstellt und wiederholt gezippt und kopiert wurde. Es wird nicht versucht, die Grenzen des Formats zu überschreiten oder die Komprimierung zu maximieren oder so - sie haben nur willkürlich 16 Kopien pro Ebene ausgewählt. Es ging darum, ohne großen Aufwand eine große Nutzlast zu erzeugen.
Hinweis: Andere Komprimierungsformate wie bzip2 bieten viel, viel, viel größere maximale Komprimierungsverhältnisse. Die meisten Zip-Parser akzeptieren sie jedoch nicht.
PS Es ist möglich, eine Zip-Datei zu erstellen, die in eine Kopie von sich selbst (eine Quine) entpackt wird. Sie können auch eine erstellen, die in mehrere Kopien von sich selbst entpackt wird. Wenn Sie eine Datei für immer rekursiv entpacken, ist die maximal mögliche Größe daher unendlich. Die einzige Einschränkung besteht darin, dass sie bei jeder Iteration um höchstens 1032 erhöht werden kann.
PPS In der Abbildung 1032 wird davon ausgegangen, dass die Dateidaten in der Zip-Datei nicht zusammenhängend sind. Eine Besonderheit des Zip-Dateiformats besteht darin, dass es ein zentrales Verzeichnis hat, in dem die Dateien im Archiv aufgelistet und zu den Dateidaten versetzt werden. Wenn Sie mehrere Dateieinträge erstellen, die auf dieselben Daten verweisen, können Sie auch ohne Verschachtelung viel höhere Komprimierungsraten erzielen. Eine solche Zip-Datei wird jedoch wahrscheinlich von Parsern abgelehnt.
quelle
Eine gute Möglichkeit, eine Zipbomb (oder Gzbomb) zu erstellen, besteht darin, das Binärformat zu kennen, auf das Sie abzielen. Selbst wenn Sie eine Streaming-Datei verwenden (z. B. mit
/dev/zero
), sind Sie dennoch durch die zum Komprimieren des Streams erforderliche Rechenleistung eingeschränkt.Ein schönes Beispiel für eine GZIP-Bombe: http://selenic.com/googolplex.gz57 (nach mehreren Komprimierungsstufen ist eine Nachricht in die Datei eingebettet, die zu riesigen Dateien führt.)
Viel Spaß beim Finden dieser Nachricht :)
quelle
Vielleicht könnten Sie unter Unix eine bestimmte Anzahl von Nullen direkt in ein Zip-Programm oder so weiterleiten? Ich weiß nicht genug über Unix, um zu erklären, wie du das machen würdest. Ansonsten würden Sie eine Quelle von Nullen benötigen und diese in einen Reißverschluss leiten, der von stdin oder so etwas liest ...
quelle
Alle Dateikomprimierungsalgorithmen basieren auf der Entropie der zu komprimierenden Informationen. Theoretisch können Sie einen Stream mit Nullen oder Einsen komprimieren, und wenn er lang genug ist, wird er sehr gut komprimiert.
Das ist der theoretische Teil. Auf den praktischen Teil wurde bereits von anderen hingewiesen.
quelle
Neuere (nach 1995) Komprimierungsalgorithmen wie bz2, lzma (7-zip) und rar ermöglichen eine spektakuläre Komprimierung monotoner Dateien, und eine einzige Komprimierungsschicht reicht aus, um übergroße Inhalte auf eine überschaubare Größe zu bringen.
Ein anderer Ansatz könnte darin bestehen, eine spärliche Datei von extremer Größe (Exabyte) zu erstellen und sie dann mit etwas Alltäglichem zu komprimieren, das spärliche Dateien (z. B. Teer) versteht. Wenn der Prüfer die Datei jetzt streamt, muss der Prüfer alle vorhandenen Nullen überlesen Nur um zwischen dem eigentlichen Inhalt der Datei zu wechseln, wenn der Prüfer sie auf die Festplatte schreibt, wird jedoch nur sehr wenig Speicherplatz verwendet (vorausgesetzt, ein gut erzogener Unarchiver und ein modernes Dateisystem).
quelle
Ich habe es versucht. Die Größe der Ausgabe-Zip-Datei war eine kleine 84-KB-Datei.
Schritte, die ich bisher gemacht habe:
Ich weiß zwar nicht, wie ich den Teil erklären soll, in dem die Komprimierung der umbenannten Zip-Datei sie immer noch auf eine kleinere Größe komprimiert, aber es funktioniert. Vielleicht fehlen mir nur die Fachbegriffe.
quelle
Silicon Valley Staffel 3 Episode 7 hat mich hierher gebracht. Die Schritte zur Erzeugung einer Reißverschlussbombe wären.
1.zip
.n
(sagen wir 10) Kopien dieser Datei und fügen Sie diese 10 Dateien einem komprimierten Archiv hinzu (sagen wir2.zip
).k
mehrmals.Überprüfen Sie dies für eine Python-Implementierung .
quelle
Ich weiß nicht, ob ZIP Run Length Encoding verwendet, aber wenn dies der Fall wäre, würde eine solche komprimierte Datei ein kleines Datenelement und einen sehr großen Wert für die Lauflänge enthalten. Der Lauflängenwert würde angeben, wie oft das kleine Datenelement wiederholt wird. Wenn Sie einen sehr großen Wert haben, sind die resultierenden Daten proportional groß.
quelle