/Разборы задач
6 ноября 2026
Райтап на задачу «Морзянка на Arduino»
Считываем мигание светодиода на видео и автоматизируем расшифровку азбуки Морзе.4
5

Misc
Задача «Современный формат»
Итак, предлагаю зайти на сам сайт и посмотреть, что там вообще находится:
Вообще суперская статейка про Мегумина, но меня смущает это пустое поле. Тем более в описании задания было сказано, что AVIF не кроссбраузерный. Смотрим на этот моментик через код страницы (Ctrl+U):
Прекрасно, ещё и написано flag, значит, мы на правильном пути. Перейдём-ка на этот авиф:
Ага, негусто… Ну, значит, придётся решать таск. Первым делом предлагаю скачать этот AVIF и удостовериться, что это точно он и нас не обманывают:
Опа! Прошу обратить внимание на вывод команды file. AVIF Image Sequence — это не просто статичная картинка, а целая последовательность кадров (фреймов). По сути, это аналог гифки, только оно упаковано всё под AVIF. Ну что же, давайте дальше копать в эту сторону. Предлагаю посмотреть ffprobe (утилита, входящая в ffmpeg, которая только собирает метаданные):
Тут важно обратить внимание всего на несколько моментов:
AVIS — это прямое подтверждение нашей догадки: это не просто статичная AVIF-картинка, а целая последовательность кадров.
STREAM 0:0 — та самая статичная картинка, то есть первый кадр;
STREAM 0:1 — то, что нам нужно, это дорожка анимации, и в ней ровно два кадра;
Наш ffprobe ругается на то, что одна служебная табличка ему говорит, что кадров 2, а другая говорит, что кадр всего 1. Именно по этой причине браузер и ffmpeg показывают только 1-й кадр.
Ну и когда мы поняли, что наш заветный флажок лежит на втором кадре, нам остаётся лишь заставить ffmpeg прочитать второй кадр. Лишь… Мы плавно перешли к моменту осознания, почему это hard task, теперь нужно будет разобраться в этом прекрасном формате поподробнее, я постараюсь сделать это максимально кратко и понятно для всех:
Вот после того, как мы вычитаем тонну информации про то, какие разновидности боксов бывают, мы придём к тому, что мы имеем дело с avis — то есть анимацией. Тут на помощь приходит такой замечательный бокс, как Sample Size Box — stsz, он выполняет весьма важную роль, сообщая плееру, ну или же декодеру, точный размер каждого кадра (сэмпла) в БАЙТАХ. Теперь давайте поищем его в нашем файле с помощью команды grep:
Мы получили 925 в десятичной → переводим в hex (шестнадцатеричную систему исчисления) и получаем 0x39d. НО мы вспоминаем, что не зря прочитали уйму информации про эти боксы, и осознаём, что stsz — это поле типа бокса. А сам наш бокс начинается на 4 байта раньше, то есть 0x39d − 4 = 0x399. Теперь мы точно знаем, где начинается наш stsz box. Проверим это:
Вывод xxd в очередной раз доказывает нашу правоту. Для примера ниже будет структура stsz-бокса:
Теперь сравниваем его с нашим дампом и смотрим сюда:
Это sample_count, и он состоит из 4 байт, но по какой-то причине там сейчас один кадр (т. к. в конце 01). НО мы знаем, что на самом деле там физически лежат два размера. Поэтому нам нужно пропатчить этот моментик и изменить младший бит на +1 для того, чтобы посмотреть на наш второй кадр:
printf '\x02' | dd of=patched.avif bs=1 seek=$((0x3ac)) conv=notrunc status=none
xdg-open frame_002.pngТеперь смотрим на наш шедевр:
Вуаля, всего лишь часик-другой вашего времени на изучение боксов AVIF, и мы забираем наш заветный флажок!