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
Работа-победитель, набравшая больше всего баллов.
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.
novafacing
https://github.com/binarygolf/BGGP/blob/main/2022/novafacing/entry.clang.txt
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
Статья с детальным описанием (заблокирована из РФ) процесса поиска этого замечательного бага.
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
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, что и убивает программу при попытке открытия.