Как и обещал, сегодня у нас с тобой хитрая стеганография на 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




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



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



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



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



Распечатаем диапазон ACSII символов 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,-}




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



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



tags: #linux #bash



💩 @bashdays