Naturalmente, essa pergunta sobre bombas zip me levou à página da Wikipedia sobre o assunto. O artigo menciona um exemplo de um arquivo zip de 45,1 kb que descompacta para 1,3 exabytes.
Quais são os princípios / técnicas que seriam usados para criar esse arquivo em primeiro lugar? Na verdade, não quero fazer isso, mais interessado em uma explicação simplificada do tipo "como funciona as coisas" dos conceitos envolvidos.
ps
O artigo menciona 9 camadas de arquivos zip, portanto, não é um caso simples de compactar zeros. Por que 9, por que 10 arquivos em cada um?
algorithm
compression
baiacu
fonte
fonte
Respostas:
Citação da página da Wikipedia:
Então, tudo o que você precisa é de um único arquivo de 1,3 GB cheio de zeros, compactá-lo em um arquivo ZIP, fazer 10 cópias, compactá-las em um arquivo ZIP e repetir esse processo 9 vezes.
Dessa forma, você obtém um arquivo que, quando descompactado completamente, produz uma quantidade absurda de dados sem exigir que você comece com essa quantidade.
Além disso, os arquivos aninhados tornam muito mais difícil programas como antivírus (o principal alvo dessas "bombas") serem inteligentes e se recusam a descompactar arquivos "muito grandes", porque até o último nível a quantidade total de dados é nem tanto, você não "vê" o tamanho dos arquivos no nível mais baixo até atingir esse nível e cada arquivo individual não é "muito grande" - apenas o grande número é problemático.
fonte
Crie um arquivo de 1,3 exabyte de zeros.
Clique com o botão direito do mouse em> Enviar para a pasta compactada (zipada).
fonte
Isso é feito facilmente no Linux, usando o seguinte comando:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
Substitua count pelo número de KB que você deseja compactar. O exemplo acima cria uma bomba zip de 10MiB (quase nenhuma bomba, mas mostra o processo).
Você NÃO precisa de espaço no disco rígido para armazenar todos os dados não compactados.
fonte
Abaixo é para Windows:
Na prova de conceito do Security Focus (NSFW!), É um arquivo ZIP com 16 pastas, cada uma com 16 pastas, que continua assim (42 é o nome do arquivo zip):
Provavelmente estou errado com esta figura, mas ela produz 4 ^ 16 (4.294.967.296) diretórios. Como cada diretório precisa de um espaço de alocação de N bytes, ele acaba sendo enorme. O arquivo DLL no final é 0 bytes.
Descompactar o primeiro diretório sozinho
\42\lib 0\book 0\chapter 0\doc 0\0.dll
resulta em 4 GB de espaço de alocação.fonte
Resposta séria:
(Basicamente) A compactação depende de detectar padrões de repetição; portanto, o arquivo zip deve conter dados que representam algo como
Arquivo zip muito curto, mas enorme quando você o expande.
fonte
Para criar um em uma configuração prática (ou seja, sem criar um arquivo de 1,3 exabyte no seu disco rígido enorme), você provavelmente precisaria aprender o formato do arquivo em um nível binário e escrever algo que se traduza na aparência do arquivo desejado, pós- compressão.
fonte
Primeiro, o artigo da Wikipedia diz atualmente 5 camadas com 16 arquivos cada. Não sei de onde vem a discrepância, mas não é tão relevante. A verdadeira questão é por que usar o aninhamento em primeiro lugar.
DEFLATE, o único método de compactação comumente suportado para arquivos zip *, possui uma taxa de compactação máxima de 1032. Isso pode ser alcançado assintoticamente para qualquer sequência repetida de 1 a 3 bytes. Não importa o que você faz com um arquivo zip, desde que esteja usando apenas DEFLATE, o tamanho descompactado será no máximo 1032 vezes o tamanho do arquivo zip original.
Portanto, é necessário usar arquivos zip aninhados para obter taxas de compactação realmente ultrajantes. Se você tiver 2 camadas de compactação, a proporção máxima se tornará 1032 ^ 2 = 1065024. Para 3, é 1099104768 e assim por diante. Para as 5 camadas usadas no 42.zip, a taxa de compressão máxima teórica é 1170572956434432. Como você pode ver, o 42.zip real está longe desse nível. Parte disso é a sobrecarga do formato zip, e parte disso é que eles simplesmente não se importaram.
Se eu tivesse que adivinhar, diria que o 42.zip foi criado apenas criando um arquivo grande e vazio e fechando e copiando repetidamente. Não há nenhuma tentativa de ultrapassar os limites do formato ou maximizar a compactação ou qualquer outra coisa - eles escolheram arbitrariamente 16 cópias por camada. O objetivo era criar uma grande carga útil sem muito esforço.
Nota: Outros formatos de compactação, como o bzip2, oferecem taxas de compactação máximas muito, muito, muito maiores. No entanto, a maioria dos analisadores de zip não os aceita.
PS É possível criar um arquivo zip que será descompactado para uma cópia de si mesmo (um arquivo). Você também pode criar um que descompacte em várias cópias de si mesmo. Portanto, se você descompactar recursivamente um arquivo para sempre, o tamanho máximo possível será infinito. A única limitação é que ele pode aumentar no máximo 1032 em cada iteração.
PPS A figura 1032 pressupõe que os dados do arquivo no zip não sejam comuns. Uma peculiaridade do formato do arquivo zip é que ele possui um diretório central que lista os arquivos no arquivo morto e compensa os dados do arquivo. Se você criar várias entradas de arquivo apontando para os mesmos dados, poderá obter taxas de compactação muito mais altas, mesmo sem aninhamento, mas esse arquivo zip provavelmente será rejeitado pelos analisadores.
fonte
Uma boa maneira de criar um zipbomb (ou gzbomb) é conhecer o formato binário que você está alvejando. Caso contrário, mesmo se você usar um arquivo de streaming (por exemplo, usando
/dev/zero
), você ainda estará limitado pelo poder de computação necessário para compactar o fluxo.Um bom exemplo de uma bomba gzip: http://selenic.com/googolplex.gz57 (há uma mensagem incorporada no arquivo após vários níveis de compactação, resultando em arquivos enormes)
Divirta-se encontrando essa mensagem :)
fonte
Talvez, no unix, você possa canalizar uma certa quantidade de zeros diretamente em um programa zip ou algo assim? Porém, você não conhece o suficiente o unix para explicar como você faria isso. Fora isso, você precisaria de uma fonte de zeros e coloque-os em um zíper que leia stdin ou algo assim ...
fonte
Todos os algoritmos de compactação de arquivos contam com o entropia das informações a serem compactadas. Teoricamente, você pode comprimir um fluxo de 0 ou 1 e, se for longo o suficiente, comprimirá muito bem.
Essa é a parte da teoria. A parte prática já foi apontada por outros.
fonte
Algoritmos de compactação recentes (pós 1995) como bz2, lzma (7-zip) e rar oferecem uma compactação espetacular de arquivos monótonos, e uma única camada de compactação é suficiente para agrupar conteúdo de grandes dimensões em um tamanho gerenciável.
Outra abordagem poderia ser criar um arquivo esparso de tamanho extremo (exabytes) e depois compactá-lo com algo mundano que entenda arquivos esparsos (por exemplo, tar), agora, se o examinador transmitir o arquivo, o examinador precisará ler além de todos os zeros existentes apenas para alternar entre o conteúdo real do arquivo, se o examinador o gravar no disco, no entanto, será usado muito pouco espaço (assumindo um desarquivador bem-comportado e um sistema de arquivos moderno).
fonte
Tentei. o tamanho do arquivo zip de saída era um pequeno arquivo de 84 KB.
Etapas que eu fiz até agora:
embora eu não saiba como explicar a parte em que a compactação do arquivo zip renomeado ainda o comprime em um tamanho menor, mas funciona. Talvez eu não tenha os termos técnicos.
fonte
O episódio 7 da temporada 3 do Vale do Silício me trouxe aqui. Os passos para gerar uma bomba zip seriam.
1.zip
.n
(digamos 10) cópias desse arquivo e adicione esses 10 arquivos a um arquivo compactado (digamos2.zip
).k
várias vezes.Para uma implementação Python, verifique isso .
fonte
Não sei se o ZIP usa a codificação de comprimento de execução, mas, se o fizesse, um arquivo compactado conteria um pequeno pedaço de dados e um valor muito grande de comprimento de execução. O valor de duração da execução especificaria quantas vezes o pequeno dado é repetido. Quando você tem um valor muito grande, os dados resultantes são proporcionalmente grandes.
fonte