Решения
http://www.koibasta.ru/2013/05/13/volgactf-2013-quals-stegasic-100/ (КОИБАСta) | Назад к списку заданий |
Задание (stegano)
Подробное описание
"Похоже, в вашей команде завелся инсайдер, потому что некоторые полетные данные куда-то утекают. Найти его - ваша главная задача. Да, кстати, не просто надо найти подозреваемого, а еще необходимо предъявить обвинения с доказательствами. Эта картинка была перехвачена прежде, чем попала к одному из ваших конкурентов. Она выглядит довольно подозрительно – хорошенько осмотрите ее".
Все было довольно очевидно. Используйте 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-файл с космонавтом без шлема и с флагом на затылке. Флаг: |