software-development
February 16

Развлечения джентельменов: Binary Golf 

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

Нет это не баг, это спецэффект!

Статья была опубликована на Хабре.

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

Как же я ошибался.

То что описано в этой статье — за гранью понимания обычного разработчика и тем более обычного человека.

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

Добро пожаловать, снова: https://binary.golf/

Люди, которые трахают байты

Однажды в одном хорошем пабе собрались несколько настоящих джентельменов от мира разработки:

демосценеры, реверсеры, ИБ-аналитики малвари и разумеется яркие представители c «другой стороны».

Когда в одном месте собираются столь крутые профи, обязательно начинается потеха под названием меряние х#ями «кто круче»:

─── Binary Golf Grand Prix 1 ───────────────────────────────────────────────//──

Welcome to the Binary Golf Grand Prix! This is a challenge for people who like
to craft tiny binaries.

Так и появился на свет этот замечательный конкурс:

The goal of the Binary Golf Grand Prix is to challenge programmers to make the
smallest possible binary that fits within certain constraints.

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

Конкурс был запущен в пандемийном 2020м году и с тех пор проводится каждый год.

Но этого показалось мало, поэтому помимо основной задачи, джентельмены каждый год придумывают себе дополнительные:

The binary you will craft will be the same executable when flipped backwards.

Да, вы все правильно поняли а некоторые наверное даже знатно ох#ели с такой постановки вопроса.

Задача заключается в том чтобы создать запускаемый бинарник, который бы все равно запускался если его перевернуть:

$ xxd some.random.exe | head -n 1
00000000: 4d5a 9000 0345 0000 0400 0000 ffff 0000  MZ...E..........

The entire binary will be reversed, and the first byte, will be the last byte:

4d5a 9000 0345 .... <-- reversed --> .... 4503 0090 5a4d 


Критериев оценки в столь замечательном конкурсе два (длина и толщина):

размер запускаемого бинарника и «процент реиспользования» байт при запуске в обратном порядке.

В оригинале:

Scores will be calculated based on both the size of the executable, as well as
the percentage of bytes executed when it is run.

Так что у джентельменов все серьезно.

Исходный код всех работ с описанием выложен на Github.

Теперь смотрим победителей этого замечательного конкурса за 2020й год.

Смотрим, х#еем и наслаждаемся.

BootNoodle: A Palindromic Bootloader for BGGP

Автор: xcellerator

Статья с детальным описанием процесса находится тут, вот так выглядит код:

Запускается в эмуляторе QEMU:

qemu-system-x86_64 bin/bootnoodle.bin

В работе:

Вот так выглядит сборка и создание «зеркальной» копии:

mkdir bin 2>/dev/null
nasm -f bin -o bin/bootnoodle.bin src/bootnoodle.asm
dd if=bin/bootnoodle.bin of=bin/tmp.bin bs=1 count=256
rm bin/bootnoodle.bin
perl -0777pe '$_=reverse $_'  bin/tmp.bin > bin/tmp2.bin
cat bin/tmp.bin bin/tmp2.bin > bin/bootnoodle.bin
rm bin/tmp*

512 байт на все, если вы вдруг не заметили.

И это у джентельменов считается «слишком много».

ns.bggp : Palindromic 64 bit ELF binary

Автор: netspooky

Статья с описанием: https://n0.lol/elf-palindrome-original/

Код:

Он же в упакованном виде:

base64 -d <<< \
f0VMRgUP/zFIPLCQkJDrNAIAPgABAAAABAAAAAEAAAAcAAAAAAAAAAAAAAAAAAAAAQAAAEAAOAAB\
AAIA6wsAAAAAAADrCwAAAAAAADzrwDFIUFVQUFlTUFlQU1lQUFVQ6xiQkJCQkAUPlbZAIObBSMaJ\
D7LHiQAAAAG4AQAAAInHsg+JxkjB5iBAtpUPBZCQkJCQGOtQVVBQWVNQWVBTWVBQVVBIMcDrPAAA\
AAAAAAvrAAAAAAAAC+sAAgABADgAQAAAAAEAAAAAAAAAAAAAAAAAAAAcAAAAAQAAAAQAAAABAD4A\
AjTrkJCQsDxIMf8PBUZMRX8= > ns.bggp

Теперь о печальном:

This was tested and built on Ubuntu 20.04 with kernel 5.4.0-42-generic.

Из-за последних изменений в ядре, бинарник более не работает на 6.х ядрах, по крайней мере мне не удалось запустить.

Вот так это должно было выглядеть:

$ ./build.sh
Executing initial binary...
PUPPYSPYPSYPPUP
00000000: 7f45 4c46 050f ff31 483c b090 9090 eb34  .ELF...1H&lt;.....4
00000010: 0200 3e00 0100 0000 0400 0000 0100 0000  ..>.............
00000020: 1c00 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0100 0000 4000 3800 0100 0200 eb0b 0000  ....@.8.........
00000040: 0000 0000 eb0b 0000 0000 0000 3ceb c031  ............&lt;..1
00000050: 4850 5550 5059 5350 5950 5359 5050 5550  HPUPPYSPYPSYPPUP
00000060: eb18 9090 9090 9005 0f95 b640 20e6 c148  ...........@ ..H
00000070: c689 0fb2 c789 0000 0001 b801 0000 0089  ................
00000080: c7b2 0f89 c648 c1e6 2040 b695 0f05 9090  .....H.. @......
00000090: 9090 9018 eb50 5550 5059 5350 5950 5359  .....PUPPYSPYPSY
000000a0: 5050 5550 4831 c0eb 3c00 0000 0000 000b  PPUPH1..&lt;.......
000000b0: eb00 0000 0000 000b eb00 0200 0100 3800  ..............8.
000000c0: 4000 0000 0100 0000 0000 0000 0000 0000  @...............
000000d0: 0000 0000 1c00 0000 0100 0000 0400 0000  ................
000000e0: 0100 3e00 0234 eb90 9090 b03c 4831 ff0f  ..>..4.....&lt;H1..
000000f0: 0546 4c45 7f                             .FLE.

Reversing...
Executing binary in reverse...
PUPPYSPYPSYPPUP
00000000: 7f45 4c46 050f ff31 483c b090 9090 eb34  .ELF...1H&lt;.....4
00000010: 0200 3e00 0100 0000 0400 0000 0100 0000  ..>.............
00000020: 1c00 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0100 0000 4000 3800 0100 0200 eb0b 0000  ....@.8.........
00000040: 0000 0000 eb0b 0000 0000 0000 3ceb c031  ............&lt;..1
00000050: 4850 5550 5059 5350 5950 5359 5050 5550  HPUPPYSPYPSYPPUP
00000060: eb18 9090 9090 9005 0f95 b640 20e6 c148  ...........@ ..H
00000070: c689 0fb2 c789 0000 0001 b801 0000 0089  ................
00000080: c7b2 0f89 c648 c1e6 2040 b695 0f05 9090  .....H.. @......
00000090: 9090 9018 eb50 5550 5059 5350 5950 5359  .....PUPPYSPYPSY
000000a0: 5050 5550 4831 c0eb 3c00 0000 0000 000b  PPUPH1..&lt;.......
000000b0: eb00 0000 0000 000b eb00 0200 0100 3800  ..............8.
000000c0: 4000 0000 0100 0000 0000 0000 0000 0000  @...............
000000d0: 0000 0000 1c00 0000 0100 0000 0400 0000  ................
000000e0: 0100 3e00 0234 eb90 9090 b03c 4831 ff0f  ..>..4.....&lt;H1..
000000f0: 0546 4c45 7f                             .FLE.

Comparing hashes...
c082d226c96b7251649c48526dd9766071fa5e59  ns.bggp
c082d226c96b7251649c48526dd9766071fa5e59  ns.bggp.R

Текст «PUPPYSPYPSYPPUP» это вывод бинарника при запуске.

Viznut/PWP

Автор: viznut

Статья с описанием: http://viznut.fi/demos/vic20/vizpalapziv.html

Код:

Это чудо в работе показано на заглавной картинке к статье, вот полноразмерный скриншот:

Краткая аннотация от автора:

Entry name: VIZPALAPZIV
Executable format: Commodore 8-bit PRG format on Commodore VIC-20
Number of bytes: 20 (including the 2-byte start address)
Executed bytes: 18 (every byte except the start address, i.e. 90%)

Bytes: 7c 00 8f 0f 90 25 48 48 73 a9 a9 73 48 48 25 90 0f 8f 00 7c

Да, это программа для Commodore, вот такой игрушечной машинки из 80х:

Которую вы врядли могли увидеть в живую.

BGGP.COM

Автор: Boo Khan Ming

Код:

Как гласит известная поговорка:

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

И код выше — лучшая тому иллюстрация.

Простой малазийский паренек сорвал куш — его код стал победителем этой специальной олимпиады в 2020 м году:

Hi!
Nice to meet you everyone there!
I am Wu (Boo Khan-Ming) from Malaysia.
I am not a scene/demo coder. 
Just join this ASMCOMPO3 for fun.

Исходник на ассемблере под DOS:

JMP 103             EB01
RET                 C3
MOV AX, B800        B800B8
MOV ES, AX          8EC0
MOV DI, 07D0        BFD007  
MOV AX, 9090        B89090
MOV ES:[DI], AX     268905
ADD AX, 2689        058926
NOP                 90
NOP                 90
MOV AX, D007        B807D0
MOV DI, 8EC0        BFC08E
MOV AX, B800        B800B8
RET                 C3

Вот так это выглядит в работе:

Эпилог

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

Так что точно будет продолжение.

P.S.

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