Продолжаю рассказывать широкой аудитории о «гусарских забавах» компьютерной элиты.

На фоне незабываемая Натали Портман в свои лучшие годы, перенесенная силами нейросети в питерскую коммуналку.
На фоне незабываемая Натали Портман в свои лучшие годы, перенесенная силами нейросети в питерскую коммуналку.

Конкурс

Однажды я уже рассказывал об этом интересном конкурсе для самых отбитых опытных из программерской тусовки, взяв для статьи работы с самого его первого проведения, случившегося в пандемийном 2020м.

На этот раз рассказ пойдет о третьем по счету BGGP, прошедшим в 2022 году:

    B  I  N  A  R  Y     G  O  L  F     G  R  A  N  D     P  R  I  X     3               
              ┌─────┐ ┌──────┐┌──────┐┌──────┐        ┌──────┐┌──────┐┌──────┐┌──────┐              
              │─────┘┐│       │       │      │        ┌──────┘│      │┌──────┘┌──────┘              
              │      ││──────┐│──────┐│──────┘        │       │      ││       │                     
              └──────┘└──────┘└──────┘└               └──────┘└──────┘└──────┘└──────┘              
                                                                                                    
                            ││┌──────┐┌──────┐┌──────┐┌──────┐┌       ││                            
                              │       │       ┌──────│└──────┐│──────┐                              
                              │       │       │      ││      ││      │                              
                              └──────┘└       └──────┘└──────┘└      ┘                              
                                                                                                    
                                  June 17th 2022->August 19th 2022       

Поясняю для непричастных:

Binary Golf Grand Prix — соревнование для особенных избранных от мира программирования и компьютеров: реверс-инженеров, пентестеров, системных программистов и хакеров в классическом понимании этого термина.

Раз в год все эти интересные личности собираются, придумывают какие‑нибудь особо изощренные правила и устраивают конкурс «для своих».

По духу все это сильно напоминает гусарские забавы времен Наполеона, отлично раскрытые в анекдотах про поручика Ржевского — чистый офицерский угар ради забавы и веселья.

На этот раз цель соревнования звучала лаконично:

The goal of the 3rd Annual Binary Golf Grand Prix (BGGP3) is to find the smallest file which will crash a specific program.

Проще говоря надо найти или подобрать набор байт, который будучи скормленным программе убьет ее при запуске. Пистолеты программу господин офицер волен выбрать самостоятельно.

Правила столь интересного конкурса разумеется тоже доставляют:

Any software running on a machine that does not belong to you will not be accepted.

Так что конь у офицера должен быть свой, а не «временно арендованный» ;)

Работы оценивались по количеству набранных баллов, чем больше баллов — тем автор(ы) круче. Правила подсчета баллов тоже весьма своеобразны:

  • Базовый скор = 4096 минус размер файла

  • Плюс 1024 за статью с описанием

  • Плюс 1024 если внутреннее состояние было перезаписано байтами 0x33's или ASCII-символом "3"

  • Плюс 2048 если было достигнуто выполнение кода, в качестве доказательства - вывод числа "3"

  • Плюс 4096 если был сделан патч, закрывающий уязвимость.

Описаны далеко не все присланные работы, только те что удалось запустить и проверить в моем окружении (FreeBSD 14.3)

David3141593

https://github.com/binarygolf/BGGP/blob/main/2022/david3141593/entry.qemu.txt

11244 баллов

Работа‑победитель, набравшая больше всего баллов.

20 байт, убивающие широко известный эмулятор Qemu, причем баг до сих пор не исправлен.

Команда-убийца:

base64 -d<<<uAJPuxhBzRC61AO+E3y5BQDzbwcMDOgTCReKG4I=>a;
qemu-system-i386 -vga cirrus -no-fd-bootchk -fda a

Как это выглядит в действии:

Как это работает:

An assert() is triggered in QEMU's CirrusVGA emulation code

С помощью специально подобранного набора байт, переданного эмулятору Qemu в качестве образа дискеты вызывается программная проверка (assert), которая при срабатывании вызывает segmentation fault.

И Qemu падает. Насмерть.

novafacing

https://github.com/binarygolf/BGGP/blob/main/2022/novafacing/entry.clang.txt

5098 баллов.

23 байта убивающие компилятор clang, причем любой актуальной версии — с 15 до 19го включительно.

Команда-убийца:

base64 -d <<< aW50IG1haW4oKXtyZXR1cm4gMTt9Cg== > crash.c;
clang -target i386-apple-windows-eabi crash.c

Хотя на самом деле тут в виде base64 закодирован минимально рабочий код:

int main(){return 1;}

Как выглядит в действии:

Что происходит:

11 Separate crashes due to mishandledtarget triples passed on command line

Из-за того что clang поддерживает слишком много разных архитектур, операционных систем и окружений:

 ┌──│Architecture
    │    ┌─────────│Vendor
    │    │  ┌────────────│Operating System
    │    │  │     ┌──────────────────────│Environment
    │    │  │     │
    i386-pc-linux-gnu

не все из комбинаций поддерживаются и работают:

To be fair, nobody really wants to target Apple as a vendor on the Cygnus CPU, hopefully.

Поэтому указание трешевого i386-apple-windows-eabi в качестве целевой платформы для компилятора приводит к падению, даже с валидным кодом:

clang -target i386-apple-windows-eabi <<< "int main(){}"

Еще у автора есть отдельная большая статья с детальным описанием процесса поиска этого бага.

_mattata

https://github.com/binarygolf/BGGP/blob/main/2022/_mattata/entry.gnucobol.txt

9176 баллов, 40 байт убивающих GNU COBOL.

Команда:

base64 -d <<< CSILQkdHUMKFMzMzM8KFLi4uM8KFMzMzM8KFLi4uM8KFMzMzM8KFAA== > crash.cob;
cobc -o /dev/null crash.cob

Внутри base64-строки вместо кода находится специально подобранный текстовый мусор:

"
         BGGP
3333
...3
3333
...3
3333

В действии:

Что происходит:

File causes crash due to stack protector in creation of an an error literal due to a 5-Byte Stack based overflow. Testcase aligns a NULL to exact size of CB_ERR_LITMAX.

Хотя куда показательней решение проблемы, именно так выглядят реальные баги а не весь этот ваш «вайб‑кодинг».

Цитируя автора:

This section correctly handles everything correctly EXCEPT a strlen of 38.

	if (strlen (literal_data) > CB_ERR_LITMAX) {

If we add a single character “=”, we should no longer see a crash.

	if (strlen (literal_data) >= CB_ERR_LITMAX) {

Как видите, всего лишь один символ может привести к падению столь сложной программы как компилятор.

Статья с детальным описанием процесса поиска этого замечательного бага по ссылке.

0xDroogy

https://github.com/binarygolf/BGGP/blob/main/2022/0xdroogy/entry.qterminal.txt

4094 баллов

2 байта (!) убивающие приложение:

qterminal allows for an option to supply commands to be run in a new terminal. When the string “0” is sent as a command, the terminal launches and crashes immediately.

Оформление согласно правилам конкурса:

base64 -d <<< MAo= > crash.txt; qterminal -e $(cat crash.txt)

или в более читаемом варианте:

qterminal -e 0

В действии:

Баг кстати вполне обыденный — такое часто встречается, когда некий «особенный» вариант использования программы просто не приходит в голову разработчикам.

Именно для таких случаев в ИТ до сих пор нужны живые тестировщики, собственно любой качественный софт все также зависит от постоянных проверок живыми людьми.

ifygecko

https://github.com/binarygolf/BGGP/blob/main/2022/ifygecko/entry.doom.txt

5112 баллов и 8 убийственных байт.

В этот раз с помощью специально сформированного «битого» файла с ресурсами в мир иной отправляется современная версия классического шутера — Chocolate Doom.

Команда-убийца:

echo -ne "IWAD\xff\xff\xff\xff" > crash.wad; chocolate-doom -iwad crash.wad

В действии:

Что происходит:

Having an 'IWAD' type wad file containing only the identification field and numlumps field with the numlumps field set to a negative value such as -1 will cause a segfault when allocating a memory block for the allocation of the lump directory from a newblock->next->prev deference that points into an invalid memory address.

Да это тоже классика «багостроения» — очень многие программы падают при попытке открытия неправильно сформированных или битых файлов с данными.

Хотя в данном конкретном случае файл был сформирован намеренно битым — в нем указано количество блоков с данными в виде -1, что и убивает программу при попытке открытия.

pierrekim_alextor

https://github.com/binarygolf/BGGP/blob/main/2022/pierrekim_alextor/entry.telnet.txt

9214 балла и 2 байта убивающие демон telnetd.. вообще везде:

FreeBSD-telnetd, NetBSD-telnetd, netkit-telnetd, telnetd in Kerberos Version 5 Applications and inetutils-telnetd are standard telnet servers used in several Linux distributions, BSD systems, UNIX systems and commercial products:

  • FreeBSD, NetBSD

  • Debian, Fedora, Gentoo, ArchLinux, ... - using inetutils-telnetd or netkit-telnetd

  • specific Palo Alto appliances

  • specific Cisco appliances

  • specific Brocade appliances

  • specific Arista appliances

  • OS running telnetd from Kerberos Version 5 Applications: this may include BSD 4.3 Reno, UNICOS 5.1 to UNICOS 7.0, SunOs 3.5 to SunOs 4.1, DYNIX V3.0.17.9 and Ultrix 3.1 to Ultrix 4.0. Note that these OS may be EOL.

Эти милые люди Pierre Kim и Alexandre Torres откопали 30-летний баг в telnetd ради победы на конкурсе:

These vulnerabilities are very old (at least 30 years).

А что ты сделал для хип-хопа?

Конечно же уязвимость на данный момент закрыта да и сам telnetd ныне можно обнаружить лишь в NAS и Wifi-роутерах, что никак не снижает степерь эпичности найденного бага и заслуженное третье место в конкурсе.

Детальная статья с разбором и описанием процесса поиска находится тут.

P.S.

Оригинал статьи в более вольном изложении можно как обычно найти в нашем блоге.

Мы (0×08 Software) давно занимаемся серьезной разработкой и по мере сил рассказываем широкой аудитории как на самом деле создаются программы а также как выглядят и работают нормальные программисты, которых врядли получится заменить нейросетью в обозримом будущем.

Комментарии (4)


  1. domix32
    15.07.2025 10:08

    11244 баллов

    а как он это сделал? тут максимальное количество 12к. Но треть их них это фикс бага, ещё почти столько же за тройки в состоянии. Фикса нет, троек нет, откуда так много баллов?


    1. alex0x08 Автор
      15.07.2025 10:08

      This score was adjusted, the exploit points were mistakenly not given. See the writeup for details

      https://github.com/binarygolf/BGGP/tree/main/2022

      Мафия, не иначе )


    1. alex0x08 Автор
      15.07.2025 10:08

      Извиняюсь, коммент выше - про другую работу (история с Lotus Notes), про qemu все проще:

      4096 - 20 + 1024 + 2048 + 4096


      1. domix32
        15.07.2025 10:08

        причем баг до сих пор не исправлен.

        PR с исправлением же висит и даже слили и даже очки посчитали.

        Про exec непонятен критерий. Надо чтобы что-то начало интерпретировать байты бинаря? Казалось бы шланг тоже +exec должен быть, но в результатах почему-то нет, а кобол да.