/// WriteUps CSAW CTF 2013 — Crypto 300 — onlythisprogram

24 Сен / 2013
Author: d1ment Tags: , , Comments: 0

Bookmark and Share

Description:
onlythisprogram.tgz


В задаче имеем 9 зашифрованных файлов и сам алгоритм шифрования на питоне.
Текст программы разукрашен заковыристыми функциями, авторы порадовали.
Видим: генерируется рандомный файл ключа длиной 256 байт. Файл циклически xor-ится с этим ключом.
Уязвимость видна, осталось ей воспользоваться.
Переходим непосредственно к крипто анализу файлов — нам достаточно базовых знаний по частотному анализу.
Делаем предположение, что какие-то из исходных файлов содержат наиболее часто повторяющийся байт: 0x00 для exe, dll, bmp (продолжите ряд сами), либо 0x20 (пробел) для текстовых файлов.
Создаем массив ключа из 256 элементов, каждый из которых содержит 256 значений. Рассмотрим на примере:

0-й байт ключа [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 865, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
1-й байт ключа [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
2-й байт ключа [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
3-й байт ключа [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 247, 3, …
4-й байт ключа [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

В первой строке мы видим, что если xor-ить каждый 0-й, 256-й, 512-й и т.д. элементы файла со значением 0 (первый элемент строки), то во всем файле не получим ни одного искомого 0x00 (забегая вперед — это bmp-шка). А вот если xor-ить эти же элементы с 12, то получаем 865 значений 0x00.
Повторяем для второго байта ключа и 1-го, 257-го, 513-го… элементов. И так далее.
Далее ищется максимальное значение в каждой строке и получается ключ. В данном случае (file5, file7) ошибки исключены.

max: [865, 870, 876, 874, 876, 871, 871, 878, 867, 873, 875, 885, 883, 877,…
key: [12, 80, 58, 200, 45, 105, 247, 211, 2, 58, 244, 172, 103, 222, 77, …
Примечание: результат работы программы для file5 несколько отличается – тут исправил для краткости примеров.

А вот пример не совсем удачного файла для данного анализа (лишнее вырезал, главное суть):
[1, 0, 0, 1, 0, 0, 0, 1, 0, 7, 8, 2, 5, 4, 2, 1, 7, 2, 0, 0,…. 0, 0, 1, 29, 1, 4, 1, 5, 0….2, 0, 2, 0, 14, 0, 0, 0,…3, 0, 27, 0, 0…
[6, 0, 1, 0, 1, 0… 13, 0, 0, 8, 1, 0, …, 0, 16, 0, 1, …0, 0, 24, 0, 0, 0, …, 0, 34, 0, 0, 0, 0,…
key: [64, 217, …
max: [29, 34, 19, 22, 28, 32, 18, 21, 26, 37, …

Как видим результат не совсем тот, хотя местами может быть правильным.

Собственно дальше все просто. Ключ нашли, xor-им каждый файл, получаем кучу хлама — картинки, wav, учебники по криптографии 🙂 и какой-то контейнер file4 без опознавательных знаков внутри. Не знаю, что это было, но TotalCommander его открыл (видимо архив) -> флаг.

Решение:





/// There are no comments yet, but you can be the first

/// Leave a Reply

*

code


Sandbox © 2013