BGGP3: Хороший тамада и конкурсы интересные
Продолжаю рассказывать широкой аудитории о «гусарских забавах» компьютерной элиты. Дело поручика Ржевского живет и господа-офицеры от программирования меряются своей крутизной и развлекаются ничуть не хуже далеких предков времен Наполеона.
На фоне незабываемая Натали Портман в свои лучшие годы, перенесенная силами нейросети в питерскую коммуналку.
Конкурс
Однажды я уже рассказывал об этом интересном конкурсе для самых отбитых опытных из программерской тусовки, взяв для статьи работы с самого его первого проведения, случившегося в пандемийном 2020м.
На этот раз рассказ пойдет о третьем по счету BGGP, прошедшим в 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
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
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 поддерживает слишком много разных архитектур, операционных систем и окружений не все из комбинаций поддерживаются и работают:
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
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
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
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
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.
Статья была опубликована на Хабре, оригинал статьи в более вольном изложении можно как обычно найти в нашем блоге.









