Steganomobile: набор на кнопочном телефоне

стеганография · задача 03   текстmulti-taproot-me

После извлечения данных телефона следователь получил последовательность байтов: 32 32 32 2D 33 33 2D 35 …. «Может быть, номер телефона?»

Платформа
Root-Me
Носитель
последовательность hex-байтов
Приём
multi-tap: повторы цифры = номер буквы на клавише
Инструменты
xxd -r -p, таблица клавиш
Статус
решено

Шаг 1. Байты → символы

Диапазон байтов говорит сам за себя: 0x30–0x39 — это цифры 0–9, 0x2D — дефис, 0x0A — перевод строки. Значит, это текст из цифр, разбитых на группы.

echo "34 34 2D 33 33 2D 35 35 35 2D 35 35 35 2D 36 36 36 0A" | xxd -r -p
44-33-555-555-666

Здесь и ниже мой пример, а не данные задачи.

Шаг 2. Почему это не номер

Группы из одинаковых цифр разной длины (44, 555) не похожи на номер телефона. Зато похожи на то, как набирали SMS до T9: чтобы получить c, клавишу 2 жмёшь три раза. Число повторов = номер буквы на клавише, дефис разделяет буквы.

1 
2abc
3def
4ghi
5jkl
6mno
7pqrs
8tuv
9wxyz
* 
0␣
# 
Клавиатура кнопочного телефона; подсвечены клавиши из примера
44 → h   33 → e   555 → l   555 → l   666 → o    ⇒  hello

Скрипт, чтобы не считать руками:

keys = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz','0':' '}
s = bytes.fromhex(open('data.txt').read()).decode().strip()
print(''.join(keys[g[0]][len(g) - 1] for g in s.split('-')))
[ответ скрыт] Это задача с Root-Me, а правила платформы просят не выкладывать ответы. Метод выше полный: по нему ответ получается за пару минут.

Что вынести

  • Числа в диапазоне 32–126 всегда стоит пробовать как ASCII. Здесь это первый слой, дальше было уже само кодирование.
  • Контекст задачи («мобильный телефон», «следователь») подсказывает кодировку не хуже инструментов.
  • Не путать multi-tap (повторы нажатий) и T9 (одно нажатие на букву плюс словарь).