VolgaCTF Quals 2013 (Stegasic 100)

Решения

http://www.koibasta.ru/2013/05/13/volgactf-2013-quals-stegasic-100/ (КОИБАСta) Назад к списку заданий

Задание (stegano)

image00.jpg

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

"Похоже, в вашей команде завелся инсайдер, потому что некоторые полетные данные куда-то утекают. Найти его - ваша главная задача. Да, кстати, не просто надо найти подозреваемого, а еще необходимо предъявить обвинения с доказательствами. Эта картинка была перехвачена прежде, чем попала к одному из ваших конкурентов. Она выглядит довольно подозрительно – хорошенько осмотрите ее".
astronaut.png

Все было довольно очевидно. Используйте stegsolve (http://www.wechall.net/download/12/Stegsolve_jar) (каждый пытался поиграться с ним, не так ли?) Картинку обрабатываем построчно. Извлекаем бит 0 от синего цвета каждого пикселя (а это, между прочим, в сумме 19012 байт), бит 0 от зеленого цвета и бит 0 – от красного. Объединяем полученные массивы данных в таком порядке: синий, зеленый, красный. Но это еще не все. Из-за того, что в stegsolve не работает выборка порядка байт (флажок MSB first, LSB first) надо отреверсить каждый байт в полученном общем потоке данных (7-й бит переставить с 0-м, 6-й с 1-м и т.д.).

Но лучше написать скрипт на Python, который сразу выдаст необходимый результат:

#!/usr/bin/env python
from PIL import Image
 
image  = Image.open('astronaut.png')
pixels = image.load()
 
s = ""
cnt = 0
ch = 0
 
# read rows image
for y in range(0, 306):
    for x in range(0, 497):
        # get pixel: b - blue
        r,g,b = pixels[x, y]
        if cnt % 8 == 0:
            s += chr(ch)
            ch = 0
        # extract bit 0 blue, byte order LSB first
        ch |= (b & 1) << (cnt % 8)
        cnt += 1
s += chr(ch)
 
for y in range(0, 306):
    for x in range(0, 497):
        # get pixel: g - green
        r,g,b = pixels[x, y]
        if cnt % 8 == 0:
            s += chr(ch)
            ch = 0
        # extract bit 0 green, byte order LSB first
        ch |= (g & 1) << (cnt % 8)
        cnt += 1
s += chr(ch)
 
for y in range(0, 306):
    for x in range(0, 497):
        # get pixel: r - red
        r,g,b = pixels[x, y]
        if cnt % 8 == 0:
            s += chr(ch)
            ch = 0
        # extract bit 0 red, byte order LSB first
        ch |= (r & 1) << (cnt % 8)
        cnt += 1
s += chr(ch)
 
# delete first byte
s = s[1:]
 
# write flag-image
fout = open("flag.jpg","wb")
fout.write(s)
fout.close()

Результат: JPG-файл с космонавтом без шлема и с флагом на затылке.

flag.jpg

Флаг:
gale crater

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