Райтап на задачу «Морзянка на Arduino»

lol

Автор:

lol

6 ноября 2026

5

06.11.2026
Морзянка на Arduino
Категория:

Misc

Задача «Морзянка на Arduino»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
xof
Сложность:
medium
Дата публикации:
12.09.2025
Решений:
67
Рейтинг:
4.09/5
Ссылка:
Решать

Весьма интересное задание) Тут есть несколько путей, как его решить:

Вариант 1:

Решение задачи «Морзянка на Arduino»: иллюстрация 1

Если не хватает терпения, есть вариант 2)

Как уже видно выше, на видео есть лампочка, которая мигает и передаёт нам наш флаг. Этот светодиод не просто так находится вдали от всех остальных, либо это и правда случайность? Но именно это позволяет нам автоматизировать процесс считывания азбуки Морзе и избавить нас от мучений)

Для начала смотрим параметры видео:

Решение задачи «Морзянка на Arduino»: иллюстрация 2

73 сек. и 60 FPS, получается, 1 кадр будет примерно 16,7 мс. Точка, которая загорается на 200 мс, → 12 кадров. Тире, соответственно, 36 кадров.

Далее:

Решение задачи «Морзянка на Arduino»: иллюстрация 3

После чего переходим в GIMP и определяем положение нашего светодиода:

Решение задачи «Морзянка на Arduino»: иллюстрация 4

Эти координаты нам нужны для ffmpeg. В нём crop записывается как ширина:высота:x:y → 40:40:495:120.

Решение задачи «Морзянка на Arduino»: иллюстрация 5

Yavg.txt содержит в себе инфу о яркости на каждом кадре. Условно 128 → не горит, а вот уже 178 → горит.

А теперь с этими данными можно и скриптик написать:

tr = []; t = None
for l in open('yavg.txt'):
    l = l.strip()
    if l.startswith('frame:'):
        t = float(l.split('pts_time:')[1])
    elif 'YAVG=' in l:
        tr.append((t, float(l.split('=')[1])))

thr = (min(y for _, y in tr) + max(y for _, y in tr)) / 2
segs = []; on = tr[0][1] > thr; st = tr[0][0]
for (a, _), (b, y) in zip(tr, tr[1:]):
    if (y > thr) != on:
        segs.append((on, st, a - st)); on = y > thr; st = b
segs.append((on, st, tr[-1][0] - st))

ons = [d for o, _, d in segs if o]
gaps = [d for o, _, d in segs if not o and d > 0.01]
u = (min(ons) + min(gaps)) / 2     # длительность точки

on_thr = u + min(ons)             # точка/тире
gap_thr = 0.5 * u + min(gaps)     # внутри буквы/между буквами

cur = ''; out = []
for o, _, d in segs:
    if o:       cur += '-' if d > on_thr else '.'
    elif cur and d >= gap_thr:
        out.append(cur); cur = ''
if cur: out.append(cur)
print(' '.join(out))
Решение задачи «Морзянка на Arduino»: иллюстрация 6

А на выходе получаем:

Решение задачи «Морзянка на Arduino»: иллюстрация 7

Теперь важно обратить внимание на наш morse.ino, ведь там дана карта символов Морзе:

Решение задачи «Морзянка на Arduino»: иллюстрация 8

А вот теперь переводим на привычный нам BugCTF:

Решение задачи «Морзянка на Arduino»: иллюстрация 9

Осталось только не забыть про те самые фигурные скобочки, и мы забираем флажок)))

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Современный формат»

/Разборы задач

Райтап на задачу «Современный формат»

Исследуем анимацию AVIF, устройство бокса stsz и восстанавливаем скрытый второй кадр.
Прочитать

5

Райтап на задачу «Побег с помощью Brainfuck»

/Разборы задач

Райтап на задачу «Побег с помощью Brainfuck»

Разбираем интерпретатор Brainfuck, обходим ограничение ввода и читаем флаг с помощью исполнения Python-кода.
Прочитать

4