2.7 KiB
ChinaOwner
У нас есть архив сырых AIS-строк формата !AIVDM с временными метками. Больше всего в галаза бросается судно, которое публикует в поле destination строки CHINA OWNER и CHINA OWNER&CREW. Эти значения - маркер правильного MMSI. Само сообщение находится в таймингах между соседними type 5 сообщениями того же борта.
Решение
Сообщения type 5 в AIS длинные, в handout они поделены на две !AIVDM-строки. Для начала склеиваем фрагменты по seq_id, каналу и timestamp, декодируем armored payload обратно в биты, отфильтровываем message type == 5. В пятом типе лежат MMSI, имя судна, destination и ETA.
AIS
!AIVDM/ type 5. Тип 5 — «Static and Voyage Related Data» судна: содержит MMSI, IMO, имя, тип, позывной, данные о грузе, destination и ETA. Формат payload — armored 6-bit ASCII, gpsd AIVDM spec описывает все поля побитно.
После декодирования всплывает один MMSI — 422451900. У этого судна destination раз за разом принимает значения CHINA OWNER и CHINA OWNER&CREW — вот он, нужный канал. Дальше сортируем все его type 5 сообщения по времени и смотрим на интервалы между соседними timestamp:
| # | Δt, сек | Δt − 280 | chr() |
|---|---|---|---|
| 1 | 379 | 99 | c |
| 2 | 377 | 97 | a |
| 3 | 392 | 112 | p |
| 4 | 388 | 108 | l |
| 5 | 377 | 97 | a |
| 6 | 383 | 103 | g |
| … | … | … | … |
Схема кодирования достаточно очевидная: chr(delta_seconds - 280). Прогоняем ту же операцию по всем дельтам — получаем полную строку флага.
Готовый скрипт — solve/decode_timing.py: python3 solve/decode_timing.py.
Флаг
caplag{watch_the_gaps_not_the_words}