Как и обещал, сегодня у нас с тобой хитрая стеганография на bash. Не скажу что тема простая, но будут готовые инструменты, которые можно взять и использовать. Не вникая в кишки.

Как говорится - чтобы что-то спрятать, нужно поместить это на видное место.

Начнём со спойлера:

ls -l /tmp/box

-rw---x---
-rw----r--
-rwx--xr--
-rw-r-----
-rw--w----
-rw----r--
-rwxr--r--
-rwx--xr--

Пока ничего не понятно, а если я сделаю так:

./mode2char /tmp/box

-rw---x---     (610)
 1100010 (98)  ('b')

-rw----r--     (604)
 1100001 (97)  ('a')

-rwx--xr--     (714)
 1110011 (115) ('s')

-rw-r-----     (640)
 1101000 (104) ('h')

-rw--w----     (620)
 1100100 (100) ('d')

-rw----r--     (604)
 1100001 (97)  ('a')

-rwxr--r--     (744)
 1111001 (121) ('y')

-rwx--xr--     (714)
 1110011 (115) ('s')

bashdays
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Сечешь фишку? Это и называется стеганография. Я спрятал в правах файлов скрытое сообщение «bashdays». Вот тут нам и пригодилась тема с правами доступа и всякими этими системами счислений. Давай разбираться как это работает.

Сами bash скрипты mode2char и char2mode закину в конце поста на гитхаб.

В примере выше у меня сопоставляются права доступа с диапазоном символов 32..126 (ASCII). Если номер 7ми битной кодировки ASCII сдвинуть на два бита, то получаем как раз те самые 9 бит прав доступа.

Давай подвигаем!

Распечатаем диапазон ASCII символов 32..126 в восьмеричном формате:

for i in 10 {32..126} ; do printf '%03o\n' $(( i << 2 )) ; done

На экран вывалится куча всего, что-то похожее на права доступа:

372
376
380

Чтобы преобразовать в обратную сторону делаем так:

for i in 440 524 545 ; do echo $(( 8#$i >> 2 )) ; done

То есть сдвигаем вправо на 2 бита. Из цифр 440, 524, 545 - получили 72, 85, 89.

Ну а теперь всю эту херню ненаглядную, преобразуем в читаемые символы.

for i in 440 524 545 ; do printf -v hex '\\x%x' $(( 8#$i >> 2 )) ; echo -e "$hex" ; done

Вот это поворот! Странно что на такую строчку антивирус не триггернулся. В общем теперь на экране красуется всем известное слово.

Помнишь я сегодня писал, что единицы двоичного представления прав доступа, соответствуют символам rwx, а нули символу «-». Таким образом можно легко получить закодированный символ вручную подставляя 0 и 1 в нужных местах.

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

Запускается так:

./char2mode /tmp/box 'Welcome to bashdays'

Указываешь директорию, где создаем структуру файлов и саму строчку, которую нужно спрятать в правах доступа.

Конечно есть нюансы. Скрипт будет орать если что-то не так. Существующие файлы не перезаписываются. Именование файлов соответствуют лексикографическому порядку сортировки. Это нужно для того, чтобы получить ту же последовательность файлов, что и при создании. Скрипт декодирования получает имена используя globbing, который сортирует именно так.

Сам скрипт декодирования лежит тут, запускается аналогично:

./mode2char /tmp/box

При использовании скрипта декодирования, можно привязать какие угодно права к конкретному символу без какой-либо логики.

Выбор велик:

printf '%s\n' {0..7}{0..7}{0..7}
printf '%s\n' {r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}

А еще же есть имена файлов, временные метки с наносекундами. Ну или вообще упороться и упаковывать более одного числа в атрибуты файла используя уникальную сортировку имен файлов.

Сложно? Конечно! Но думаю общую идею ты понял. Изучай! Увидимся совсем скоро.