EBCTF Teaser 2013 (CRY100)

Решения

http://hexpresso.wordpress.com/2013/06/01/ebctf-2013-teaser-cry100-write-up/ (hexpresso)
http://v0ids3curity.blogspot.ru/2013/06/ebctf-teaser-2013-crypto-100-team-xbios.html (xbios)
http://f00l.de/blog/ebctf-teaser-2013-cry100/ (Rup0rt)
https://cesena.ing2.unibo.it/2013/06/02/ebctf-2013-espionage-crypto-100/ (Ce.Se.N.A.)
Назад к списку заданий

Задание (crypto)

Challenge CRY100 "Espionage"

Мы подозреваем, что сотрудник одного из посольств сливает конфиденциальную информацию иностранной разведке. Нам удалось поймать человека, которого мы считаем получателем информации. Наши эксперты смогли восстановить два сообщения из его почты, которые, кажется, зашифрованы с использованием каких-то инструментов. Вместе с каждым письмом наш подозреваемый получал еще и СМС сообщение, содержащее пароль. Однако, мы восстановили только один - "SieR1mephad7oose". Не могли бы вы помочь нам расшифровать оба сообщения?

Архив cry100_espionage

Подробное описание

В архиве помимо зашифрованных сообщений (msg001.enc и msg002.enc) есть и сам криптоалгоритм (crypto.py). Мы уже знаем первый пароль. Сначала расшифровываем 1-е сообщение:

$ python crypto.py decrypt SieR1mephad7oose msg001.enc msg001.dec

Текст расшифрованного первого сообщения (msg001.dec)

From: Vlugge Japie <moc.oohay|eipaj.lv#moc.oohay|eipaj.lv>
To: Baron van Neemweggen <moc.liamz|neggewmeen.b#moc.liamz|neggewmeen.b>
Subj: Weekly update

Boss,

Sorry, I failed to get my hands on the information you
requested. Please don't tell the bureau - I'll have it
next week, promise!

Vlugge Japie

Пробуем этот же пароль на втором сообщении. Естественно, не подходит. А теперь смотрим код криптоалгоритма.

Функция создания ключа h(value):

  1. К value применяем алгоритм хэширования sha256. Получаем хэш в 32 байта. Разбиваем хэш на две половинки по 16 байт. XORим их между собой. Получили ключ (KEY). Внимание: длина ключа 16 байт.
  2. Перейти на шаг [1] и повторить 2000 раз: KEY = h(KEY)
image00.jpg
Шифрование
  1. Сообщение (M) разбиваем на блоки по 16 байт (Mi).
  2. Блок шифруется: Enc = Mi XOR KEY
  3. К ключу добавляем строку (по сути, она константа для выбранного сообщения – это строковое представление длины сообщения) и обновляем ключ: KEY = h(KEY + str(len(M)))
  4. Перейти на шаг [2] для шифрования следующего блока сообщения.

Чтобы расшифровать сообщение, необязательно знать пароль, достаточно знать только первые 16 байт открытого текста. А т.к. сообщения отправляются одним и тем же человеком, то можно предположить, что почтовые заголовки обоих сообщений совпадают.
Первые 16 байт первого сообщения:
"From: Vlugge Jap" = "\x46\x72\x6F\x6D\x3A\x20\x56\x6C\x75\x67\x67\x65\x20\x4A\x61\x70".
Первые 16 байт второго сообщения:
"\xAC\x5A\xD6\xC5\x7D\x91\xCB\x0D\x75\xAB\x2E\x26\xD2\x67\x8E\x81"
XORим их между собой, получаем стартовое значение ключа:
"\xEA\x28\xB9\xA8\x47\xB1\x9D\x61\x00\xCC\x49\x43\xF2\x2D\xEF\xF1"

Пишем небольшой скрипт для расшифровки второго сообщения.

# -*- coding: cp1251 -*-
import hashlib, string, sys
 
def xor(a, b):
    l = min(len(a), len(b))
    return ''.join([chr(ord(x) ^ ord(y)) for x, y in zip(a[:l], b[:l])])
 
def h(x):
    x = hashlib.sha256(x).digest()
    x = xor(x[:16], x[16:])
    return x
 
# Читаем зашифрованный текст
f = open("msg002.enc","rb")
msg = f.read()
f.close()
 
msg = msg.decode('base64')
k = "\xEA\x28\xB9\xA8\x47\xB1\x9D\x61\x00\xCC\x49\x43\xF2\x2D\xEF\xF1"
 
# Расшифровываем
out = ""
for i in xrange(0, len(msg), 16):
    out += xor(msg[i:i+16], k)
    k = h(k + str(len(msg)))
 
# Записываем открытый текст
f = open("msg002.dec","wb")
f.write(out)
f.close()

Результат:

From: Vlugge Japie <moc.oohay|eipaj.lv#moc.oohay|eipaj.lv>
To: Baron van Neemweggen <moc.liamz|neggewmeen.b#moc.liamz|neggewmeen.b>
Subj: Found it!

Boss,

I found some strange code on one of the documents.
Is this what you're looking for?

ebCTF{21bbc4f404fa2057cde2adbf864b5481}

Vlugge Japie

Флаг:
ebCTF{21bbc4f404fa2057cde2adbf864b5481}

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License