Esta pregunta sobre las bombas zip naturalmente me llevó a la página de Wikipedia sobre el tema. El artículo menciona un ejemplo de un archivo zip de 45.1 kb que se descomprime a 1.3 exabytes.
¿Cuáles son los principios / técnicas que se utilizarían para crear dicho archivo en primer lugar? Realmente no quiero hacer esto, más interesado en una explicación simplificada de "cómo funciona" de los conceptos involucrados.
PD
El artículo menciona 9 capas de archivos zip, por lo que no es un simple caso de comprimir un montón de ceros. ¿Por qué 9, por qué 10 archivos en cada uno?
algorithm
compression
pez globo
fuente
fuente
Respuestas:
Citando de la página de Wikipedia:
Entonces, todo lo que necesita es un solo archivo de 1.3GB lleno de ceros, comprimirlo en un archivo ZIP, hacer 10 copias, empaquetarlos en un archivo ZIP y repetir este proceso 9 veces.
De esta manera, obtienes un archivo que, cuando se descomprime por completo, produce una cantidad absurda de datos sin requerir que comiences con esa cantidad.
Además, los archivos anidados hacen que sea mucho más difícil para los programas como los escáneres de virus (el objetivo principal de estas "bombas") ser inteligentes y negarse a desempaquetar archivos que son "demasiado grandes", porque hasta el último nivel la cantidad total de datos es no tanto, usted no "ve" qué tan grandes son los archivos en el nivel más bajo hasta que haya alcanzado ese nivel, y cada archivo individual no es "demasiado grande", solo el gran número es problemático.
fuente
Cree un archivo de exabyte 1.3 de ceros.
Haga clic derecho> Enviar a la carpeta comprimida (comprimida).
fuente
Esto se hace fácilmente bajo Linux usando el siguiente comando:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
Reemplace el recuento con el número de KB que desea comprimir. El ejemplo anterior crea una bomba zip de 10MiB (no es una gran bomba, pero muestra el proceso).
NO necesita espacio en el disco duro para almacenar todos los datos sin comprimir.
fuente
A continuación es para Windows:
Desde la prueba de concepto Security Focus (NSFW!), Es un archivo ZIP con 16 carpetas, cada una con 16 carpetas, que continúa así (42 es el nombre del archivo zip):
Probablemente estoy equivocado con esta cifra, pero produce 4 ^ 16 (4,294,967,296) directorios. Debido a que cada directorio necesita un espacio de asignación de N bytes, termina siendo enorme. El archivo dll al final es de 0 bytes.
Descomprimir el primer directorio solo
\42\lib 0\book 0\chapter 0\doc 0\0.dll
da como resultado 4 gb de espacio de asignación.fuente
Respuesta seria:
(Muy básicamente) La compresión se basa en detectar patrones repetitivos, por lo que el archivo zip contendría datos que representan algo como
Archivo zip muy corto, pero enorme cuando lo expande.
fuente
Para crear uno en un entorno práctico (es decir, sin crear un archivo de 1.3 exabytes en su disco duro enorme), probablemente tenga que aprender el formato de archivo a nivel binario y escribir algo que se traduzca a cómo se vería su archivo deseado, después de compresión.
fuente
En primer lugar, el artículo de Wikipedia dice actualmente 5 capas con 16 archivos cada una. No estoy seguro de dónde viene la discrepancia, pero no es tan relevante. La verdadera pregunta es por qué usar anidamiento en primer lugar.
DEFLATE, el único método de compresión comúnmente soportado para archivos zip *, tiene una relación de compresión máxima de 1032. Esto puede lograrse asintóticamente para cualquier secuencia repetitiva de 1-3 bytes. No importa lo que le haga a un archivo zip, siempre y cuando solo esté usando DEFLATE, el tamaño desempaquetado será como máximo 1032 veces el tamaño del archivo zip original.
Por lo tanto, es necesario usar archivos zip anidados para lograr relaciones de compresión realmente escandalosas. Si tiene 2 capas de compresión, la relación máxima se convierte en 1032 ^ 2 = 1065024. Para 3, es 1099104768, y así sucesivamente. Para las 5 capas utilizadas en 42.zip, la relación de compresión máxima teórica es 1170572956434432. Como puede ver, el 42.zip real está lejos de ese nivel. Parte de eso es la sobrecarga del formato zip, y parte de eso es que simplemente no les importaba.
Si tuviera que adivinar, diría que 42.zip se formó simplemente creando un archivo vacío grande y comprimiéndolo y comprimiéndolo repetidamente. No hay ningún intento de superar los límites del formato o maximizar la compresión ni nada, simplemente seleccionaron arbitrariamente 16 copias por capa. El punto era crear una gran carga útil sin mucho esfuerzo.
Nota: Otros formatos de compresión, como bzip2, ofrecen relaciones de compresión máxima mucho, mucho, mucho más grandes. Sin embargo, la mayoría de los analizadores zip no los aceptan.
PD: es posible crear un archivo zip que se descomprimirá en una copia de sí mismo (una quine). También puede hacer uno que descomprima en múltiples copias de sí mismo. Por lo tanto, si descomprime recursivamente un archivo para siempre, el tamaño máximo posible es infinito. La única limitación es que puede aumentar como máximo 1032 en cada iteración.
PPS La figura 1032 supone que los datos del archivo en el archivo zip son disjuntos. Una peculiaridad del formato de archivo zip es que tiene un directorio central que enumera los archivos en el archivo y se desplaza a los datos del archivo. Si crea múltiples entradas de archivo que apuntan a los mismos datos, puede lograr relaciones de compresión mucho más altas incluso sin anidar, pero es probable que los analizadores rechacen dicho archivo zip.
fuente
Una buena manera de crear un zipbomb (o gzbomb) es conocer el formato binario al que se dirige. De lo contrario, incluso si usa un archivo de transmisión (por ejemplo, usando
/dev/zero
), todavía estará limitado por la potencia informática necesaria para comprimir la transmisión.Un buen ejemplo de una bomba gzip: http://selenic.com/googolplex.gz57 (hay un mensaje incrustado en el archivo después de varios niveles de compresión que resultan en archivos enormes)
Diviértete encontrando ese mensaje :)
fuente
¿Quizás, en Unix, podría canalizar una cierta cantidad de ceros directamente en un programa zip o algo así? Sin embargo, no sé lo suficiente sobre Unix para explicar cómo lo harías. Aparte de eso, necesitaría una fuente de ceros y colocarlos en una cremallera que lea de stdin o algo así ...
fuente
Todos los algoritmos de compresión de archivos se basan en la entropía de la información a comprimir. Teóricamente, puede comprimir una secuencia de 0 o 1, y si es lo suficientemente larga, se comprimirá muy bien.
Esa es la parte de la teoría. La parte práctica ya ha sido señalada por otros.
fuente
Algoritmos de compresión recientes (posteriores a 1995) como bz2, lzma (7-zip) y rar dan una compresión espectacular de archivos monótonos, y una sola capa de compresión es suficiente para envolver contenido de gran tamaño a un tamaño manejable.
Otro enfoque podría ser crear un archivo disperso de tamaño extremo (exabytes) y luego comprimirlo con algo mundano que comprenda archivos dispersos (por ejemplo, tar), ahora si el examinador transmite el archivo, el examinador deberá leer más allá de todos los ceros que existen solo para rellenar entre el contenido real del archivo, si el examinador lo escribe en el disco, sin embargo, se utilizará muy poco espacio (suponiendo un desarchivador con buen comportamiento y un sistema de archivos moderno).
fuente
Lo intenté. El tamaño del archivo zip de salida era un pequeño archivo de 84 KB.
Pasos que hice hasta ahora:
aunque no sé cómo explicar la parte donde la compresión del archivo zip renombrado todavía lo comprime en un tamaño más pequeño, pero funciona. Quizás solo me faltan los términos técnicos.
fuente
Silicon Valley Season 3 Episode 7 me trajo aquí. Los pasos para generar una bomba zip serían.
1.zip
.n
(digamos 10) copias de este archivo y agregue estos 10 archivos a un archivo comprimido (digamos2.zip
).k
varias veces.Para una implementación de Python, verifique esto .
fuente
No sé si ZIP usa la codificación de longitud de ejecución, pero si lo hiciera, un archivo comprimido de este tipo contendría una pequeña pieza de datos y un valor de longitud de ejecución muy grande. El valor de longitud de ejecución especificaría cuántas veces se repite el pequeño dato. Cuando tiene un valor muy grande, los datos resultantes son proporcionalmente grandes.
fuente