software-development
June 26

BGGP3: Хороший тамада и конкурсы интересные

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

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

Конкурс

Однажды я уже рассказывал об этом интересном конкурсе для самых отбитых опытных из программерской тусовки, взяв для статьи работы с самого его первого проведения, случившегося в пандемийном 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.

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

Не буду детально расписывать правила оценки присланных работ — отечественному читателю и тем более — простому обывателю вне ИТ-индустрии оно мало интересно, поэтому перейдем сразу к самим работам.

Описаны далеко не все присланные работы, только те что удалось запустить и проверить в моем окружении (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 Cirrus
VGA emulation code

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

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

novafacing

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

5098 баллов.

23 байта убивающие широко известный компилятор clang. Любой 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 mishandled
target 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) {

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

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, что и убивает программу при попытке открытия.