[algorithm] Zip 폭탄은 어떻게 만드나요?

우편 폭탄에 대한 이 질문 은 당연히 주제에 관한 Wikipedia 페이지로 연결 되었습니다. 이 기사에서는 1.3 엑사 바이트로 압축 해제되는 45.1 kb zip 파일의 예를 언급합니다.

처음에 그러한 파일을 만드는 데 사용될 원칙 / 기술은 무엇입니까? 나는 실제로 이것을하고 싶지 않다. 관련된 개념에 대한 단순화 된 “어떻게 작동 하는가”설명에 더 관심이있다.

추신

이 기사에서는 9 개의 zip 파일 레이어를 언급하므로 여러 개의 0을 압축하는 단순한 사례는 아닙니다. 왜 9, 왜 각각에 10 개의 파일이 있습니까?



답변

Wikipedia 페이지에서 인용 :

Zip 폭탄의 한 예는 45.1.zip 파일로, 45.1 킬로바이트의 압축 된 데이터로, 10 세트의 중첩 된 zip 파일 9 개 레이어를 포함하고, 각 맨 아래 레이어 아카이브 에는 총 1.30 엑사 바이트의 압축되지 않은 데이터에 대해 1.30 기가 바이트 파일이 포함 됩니다. .

따라서 1.3GB 크기의 단일 0GB 파일 하나만 압축하여 ZIP 파일로 압축 한 다음 10 개의 사본을 만들고 ZIP 파일로 압축 한 다음이 과정을 9 번 반복하면됩니다.

이 방법으로, 당신은 완전히 압축을 풀 때, 그 양으로 시작하지 않고도 터무니없는 양의 데이터를 생성하는 파일을 얻습니다.

또한 중첩 된 아카이브는 바이러스 스캐너 (이러한 “폭탄”의 주요 대상)와 같은 프로그램이 현명하고 “너무 큰”아카이브의 압축을 풀기를 거부합니다. 마지막 레벨까지 총 데이터 양이 그다지 중요하지는 않지만 가장 낮은 수준의 파일이 해당 수준에 도달 할 때까지 얼마나 큰지 “보지”않으며 각 개별 파일이 “너무 크지”않습니다. 큰 숫자 만 문제가됩니다.


답변

0의 1.3 엑사 바이트 파일을 작성하십시오.

마우스 오른쪽 버튼으로 클릭> 압축 (zip) 폴더로 보내기.


답변

Linux에서 다음 명령을 사용하여 쉽게 수행 할 수 있습니다.

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

count를 압축하려는 KB 수로 바꾸십시오. 위의 예제는 10MiB zip 폭탄을 생성합니다 (폭탄은 많지 않지만 프로세스를 보여줍니다).

압축되지 않은 모든 데이터를 저장하기 위해 하드 디스크 공간이 필요하지 않습니다.


답변

아래는 Windows 용입니다.

로부터 개념의 보안 초점 증거 (! NSFW)는, 그것은 (42 zip 파일 이름)과 같이 간다 16 개 폴더 16 개 폴더, 각이있는 ZIP 파일입니다 :

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

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

나는이 그림에 잘못되었을 수도 있지만 4 ^ 16 (4,294,967,296) 디렉토리를 생성합니다. 각 디렉토리에는 N 바이트의 할당 공간이 필요하기 때문에 결국 용량이 큽니다. 끝에있는 dll 파일은 0 바이트입니다.

첫 번째 디렉토리 만 압축 해제하면 \42\lib 0\book 0\chapter 0\doc 0\0.dll4GB의 할당 공간이 생성됩니다.


답변

심각한 답변 :

압축은 반복되는 패턴을 발견하기 때문에 압축 파일은 다음과 같은 데이터를 포함합니다.

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

매우 짧은 zip 파일이지만 확장하면 크기가 큽니다.


답변

실제 환경에서 파일을 만들려면 (즉, 엄청난 하드 드라이브에 1.3 엑사 바이트 파일을 만들지 않고) 파일 형식을 이진 수준에서 배우고 원하는 파일의 모양을 번역해야 할 수도 있습니다. 압축.


답변

이 기사에서는 9 개의 zip 파일 레이어를 언급하므로 여러 개의 0을 압축하는 단순한 사례는 아닙니다. 왜 9, 왜 각각에 10 개의 파일이 있습니까?

우선, Wikipedia 기사는 현재 16 개의 파일이있는 5 개의 레이어를 말합니다. 불일치가 어디에서 왔는지 확실하지 않지만 그게 전부가 아닙니다. 진짜 질문은 왜 처음부터 중첩을 사용 하는가입니다.

압축 파일 *에 대해 유일하게 지원되는 압축 방법 인 DEFLATE는 최대 압축률이 1032입니다. 이는 1-3 바이트의 모든 반복 시퀀스에 대해 무조건 달성 할 수 있습니다. 압축 파일에 대해 수행하는 작업에 관계없이 DEFLATE 만 사용하는 한 압축 해제 된 크기는 원래 압축 파일 크기의 최대 1032 배입니다.

따라서 중첩 된 zip 파일을 사용하여 엄청나게 큰 압축 비율을 달성해야합니다. 압축 레이어가 2 개인 경우 최대 비율은 1032 ^ 2 = 1065024가됩니다. 3의 경우 1099104768 등입니다. 42.zip에 사용 된 5 개 계층의 경우 이론상 최대 압축 비율은 1170572956434432입니다. 실제로 볼 수 있듯이 실제 42.zip은 해당 레벨과는 거리가 멀습니다. 그중 일부는 zip 형식의 오버 헤드이며 일부는 방금 신경 쓰지 않았습니다.

추측해야한다면 42.zip은 큰 빈 파일을 만들고 반복적으로 압축하여 복사하여 형성되었다고 말할 수 있습니다. 형식의 한계를 뛰어 넘거나 압축 등을 극대화하려는 시도는 없습니다. 레이어 당 16 개의 사본을 임의로 선택했습니다. 요점은 많은 노력없이 큰 페이로드를 만드는 것이 었습니다.

참고 : bzip2와 같은 다른 압축 형식은 훨씬 더 큰 최대 압축 비율을 제공합니다. 그러나 대부분의 zip 파서는 허용하지 않습니다.

추신 : zip 파일을 만들어서 사본 자체의 압축을 풀 수 있습니다 (quiine). 또한 여러 개의 사본을 압축 해제 할 수도 있습니다. 따라서 파일을 영원히 재귀 적으로 압축 해제하면 가능한 최대 크기는 무한대입니다. 유일한 제한 사항은 각 반복마다 최대 1032까지 증가 할 수 있다는 것입니다.

PPS 1032 그림은 zip의 파일 데이터가 분리되어 있다고 가정합니다. zip 파일 형식의 단점 중 하나는 아카이브의 파일을 나열하고 파일 데이터로 오프셋하는 중앙 디렉토리가 있다는 것입니다. 동일한 데이터를 가리키는 파일 항목을 여러 개 만들면 중첩 없이도 압축률이 훨씬 높아지지만 파서는 이러한 zip 파일을 거부 할 수 있습니다.