суббота, 26 декабря 2015 г.

Стеганография, "Война и мир" и олимпиада

Недавно прошла олимпиада по информационной безопасности между студентами ВУЗов, где можно было попрактиковаться в знаниях и умениях.  Олимпиада называлась MCTF и проходила в МИРЭА.
Были задачи в том числе и по стеганографии, но почему то они не пользовались популярностью среди команды. Про одну их них я напишу, как про яркий пример несложного алгоритма сокрытия "на сообразительность". Итак...

Текстовая стеганография на Московских студенческих межвузовских соревнованиях по информационной безопасности (MCTF).

Задание формулируется просто: есть текст одной из глав романа "Война и мир". Надо "вытащить" оттуда скрытую информацию.


Смотрим стегоконтейнер

Вспомним, какие виды стеганографии в тексте мы знаем. Самый распространенный вариант - использовать дополнительные пробелы между словами или в конце строки. Открываем файл текстовым редактором и смотрим:

Содержимое файла со стеганографией
Ну так и есть! В конце каждой строки куча пробелов. Встречаются 2 вида "лишнего пространства" - 4 и 5 пробелов в конце строки. Логично предположим, что

  • 4 пробела - это 0
  • 5 пробелов - это 1


Пишем программу извлечения скрытых данных

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

К сожалению готовой программы для извлечения скрытых данных при помощи этого метода нет. Делать нечего, придется засучить рукава и программировать. Для этого воспользуемся замечательным интерпретатором командной строки BASH.
Итак код (в первом приближении)

#!/bin/bash
file="100.txt"

while read line; do

    string=`echo "$line" | grep "     "`
    if [ "$string" == "" ]; then
 echo 0
    else
 echo 1
    fi

done <$file
Простенький скрипт, который декодирует скрытую информацию из строк. Дальше уже стандартная работа - собираем нолики и единички блоками по 8 (то есть по байту) и декодируем текст в буквы при помощи таблицы ASCII.
Получаем:

0111 1011 0x7b {
0100 0101 0x45 E
0111 0110 0x76 v
0110 0101 0x65 e
0111 0010 0x72 r
0111 1001 0x79 y
0101 1111 0x5f _
0111 0011 0x73 s
0110 1001 0x69 i
0110 1110 0x6E n
0110 0111 0x67 g
0110 1100 0x6c l
0110 0101 0x65 e
0101 1111 0x5f _
0111 0011 0x73 s
0111 0000 0x70 p
0110 0001 0x61 a
0110 0011 0x63 c
0110 0101 0x65 e
0101 1111 0x5f _
0110 0011 0x63 c
0110 0111 0x67 o
0111 0101 0x75 u
0110 1110 0x6e n
0111 0100 0x74 t
0111 0011 0x73 s
0111 1101 0x7d }
0000 0000
0000 0000
0000 0000

И - ответ!

К счастью скрытая информация прячется не во всех 458 строках, а то восстанавливать ее было бы совсем долго. Соберем, что у нас получилось. Итак, правильный ответ
{Every_single_space_counts}

3 комментария:

  1. Ответы
    1. Спасибо!! Будут еще публикации, следите)

      Удалить
  2. Уважаемый Владимир!
    С большим удовольствием узнали мы из Вашей статьи, что организаторы Олимпиады по защите информации знакомы с теми сведениями, которые Вы распространяли ещё в апреле 2012 года. Тем не менее приятно было повторить пройденное. Отрадно также видеть рост числа наиквалифицированнейших стеганографов.

    ОтветитьУдалить