Как стать автором
Обновить

Компиляторная бомба: 29 байт кода → 16 ГБ .exe

Время на прочтение 2 мин
Количество просмотров 54K
Достойный наследник ZIP-бомбы и PNG-бомбы (которая в своё время положила Хабр) — компиляторная бомба, которая генерирует огромный бинарник из нескольких строчек кода. Наилучший на сегодня вариант предложил в 2016 году пользователь StackExchange под ником Digital Trauma (последняя версия протестирована в 2020 году). Код на C:

main[-1u]={1};

Это 14 байт. По условиям конкурса к результату добавляется 15 обязательных байт (дополнительный параметр для компилятора).

Данный код определяет функцию main как большой массив и инициализирует его первый элемент. Такое поведение заставляет компилятор GCC хранить весь массив в результирующем исполняемом файле.

Поскольку массив больше двух гигабайт, при компиляции следует указать флаг -mcmodel=medium.

Компиляция следующей командой:

gcc -mcmodel=medium cbomb.c -o cbomb

Не каждая машина осилит такую компиляцию. Эксперименты показали, что с ней справляется виртуальная машина RedHat 5.6 с 10 ГБ RAM, свопом на 12 ГБ и большим локальным разделом в /tmp. GCC версии 4.1.2. Общее время компиляции около 27 минут.

Компилировать на продакшн-машине не рекомендуется.

В итоге получается исполняемый файл размером 17 179 875 837 байт (16 гигабайт).

Конкурс на лучшую бомбу не закончен.

ZIP и PNG


Напомним, оптимальная нерекурсивная zip-бомба обеспечивает высокую степень сжатия путём перекрытия файлов внутри zip-контейнера. «Нерекурсивная» означает, что она не зависит от рекурсивной распаковки декомпрессорами файлов, вложенных в zip-архивы: здесь всего один раунд. Выходной размер увеличивается квадратично от входного, достигая степени сжатия более 28 миллионов (10 МБ → 281 ТБ) в пределах формата zip. Ещё большее расширение возможно с помощью 64-разрядных расширений. Конструкция использует только наиболее распространённый алгоритм сжатия DEFLATE и совместима с большинством парсеров zip.

  • zbsm.zip 42 kB → 5.5 GB
  • zblg.zip 10 MB → 281 TB
  • zbxl.zip 46 MB → 4.5 PB (Zip64, менее совместима с парсерами)

Исходный код:
git clone https://www.bamsoftware.com/git/zipbomb.git
zipbomb-20190702.zip

В графическом формате PNG тоже используется алгоритм сжатия DEFLATE в библиотеке zlib. Таким образом, был создан файл spark.png.bz2 (420 байт). Сначала алгоритм DEFLATE заменяет повторяющиеся строки указателями (LZ77), при этом каждая пара бит кодирует 258 одинаковых байтов с нулями. Степень компрессии составляет 1032 к 1. Затем за дело берётся bzip2, который сжимает длинный набор одинаковых значений в максимально компактный вид. В архиве на 420 байт — файл PNG размером 6 132 534 байт (5,8 МБ) и изображением 225 000 × 225 000  пикселей (50,625 гигапикселей). В пиксельном буфере с тремя байтами на пиксель картинка займёт примерно 141,4 ГБ. Картинка почти полностью состоит из нулей, с секретным сообщением в центре. Закачка такой картинки на Habrastorage приводила к падению сервера, а установка в качестве аватары на Хабре привела к падению сайта. После этого на сайте были установлены противобомбовые ограничения.
Теги:
Хабы:
+70
Комментарии 33
Комментарии Комментарии 33

Другие новости

Истории

Работа

Программист С
41 вакансия

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн