Как и обещал, сегодня у нас с тобой хитрая стеганография на bash. Не скажу что тема простая, но будут готовые инструменты, которые можно взять и использовать. Не вникая в кишки.
Как говорится - чтобы что-то спрятать, нужно поместить это на видное место.
Начнём со спойлера:
Пока ничего не понятно, а если я сделаю так:
Сечешь фишку? Это и называется стеганография. Я спрятал в правах файлов скрытое сообщение «bashdays». Вот тут нам и пригодилась тема с правами доступа и всякими этими системами счислений. Давай разбираться как это работает.
Сами bash скрипты mode2char и char2mode закину в конце поста на гитхаб.
В примере выше у меня сопоставляются права доступа с диапазоном символов 32..126 (ASCII). Если номер 7ми битной кодировки ASCII сдвинуть на два бита, то получаем как раз те самые 9 бит прав доступа.
Давай подвигаем!
Распечатаем диапазон ACSII символов 32..126 в восьмеричном формате:
На экран вывалится куча всего, что-то похожее на права доступа:
Чтобы преобразовать в обратную сторону делаем так:
То есть сдвигаем вправо на 2 бита. Из цифр 440, 524, 545 - получили 72, 85, 89.
Ну а теперь всю эту херню ненаглядную, преобразуем в читаемые символы.
Вот это поворот! Странно что на такую строчку антивирус не триггернулся. В общем теперь на экране красуется всем известное слово.
Помнишь я сегодня писал, что единицы двоичного представления прав доступа, соответствуют символам rwx, а нули символу «-». Таким образом можно легко получить закодированный символ вручную подставляя 0 и 1 в нужных местах.
А вот и сам скрипт, который разбивает строку и генерирует кучку файлов с нужными правами доступа. В скрипте не используются сдвиги, работает всё через ассоциативные массивы для декодирования.
Запускается так:
Указываешь директорию, где создаем структуру файлов и саму строчку, которую нужно спрятать в правах доступа.
Конечно есть нюансы. Скрипт будет орать если что-то не так. Существующие файлы не перезаписываются. Именование файлов соответствуют лексикографическому порядку сортировки. Это нужно для того, чтобы получить ту же последовательность файлов, что и при создании. Скрипт декодирования получает имена используя globbing, который сортирует именно так.
Сам скрипт декодирования лежит тут, запускается аналогично:
При использовании скрипта декодирования, можно привязать какие угодно права к конкретному символу без какой-либо логики.
Выбор велик:
А еще же есть имена файлов, временные метки с наносекундами. Ну или вообще упороться и упаковывать более одного числа в атрибуты файла используя уникальную сортировку имен файлов.
Сложно? Конечно! Но думаю общую идею ты понял. Изучай! Увидимся совсем скоро.
tags: #linux #bash
—
💩 @bashdays
Как говорится - чтобы что-то спрятать, нужно поместить это на видное место.
Начнём со спойлера:
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
—