Basic Images - TJCTF2016

Задание: дана картинка и требуется найти флаг.
shades_94e8895ce768575f55dd91819c8e5db7d9d7a913062dd8f2d4bc1742c0c46ecc.png.zip [257,69 Kb] (cкачиваний: 199)

Basic Images - TJCTF2016

Первое, на что мы должны обратить внимание, так это название таска "Grey Shades" - оттенки серого. А тк у нас картинка .PNG (то есть она не сжата), вероятнее всего была работа с отдельно взятыми серыми пикселями.

Откроем это изображение в любом редакторе (советую привыкать к Photoshop), позволяющем посмотреть точный цвет пикселя и видим следующее:

Basic Images - TJCTF2016


Наши цвета колеблются от 50 до 150. Так ведь это читабельные символы в ASCII!

Пишем на коленке программу, делающее следующее:

1. Проходится по каждому пикселю на изображении (по вертикалям сверху-вниз)
2. Получает цвет пикселя.
3. Переводит "номер" цвета в символ chr()
4. Обьединяет все символы в одну строку.

Код программы:

from PIL import Image

#загружаем изображение
im = Image.open('shades_94e8895ce768575f55dd91819c8e5db7d9d7a913062dd8f2d4bc1742c0c46ecc.png')

answer = ''

#конвентируем изображение в массив пикселей с тремя параметрами Red, Green и Blue
rgb = im.convert('RGB')

#проходимся по вертикалям (524 - высота, 308 - ширина )
for y in range(524):
	for x in range(308):
		#получаем цвет пикселя
		r, g, b = rgb.getpixel((x, y))
		#добавляем "символ" цвета в строку
		answer+=chr(r)



Выводить всю строку не буду (тк ее длинна 161392 символов:)
Скажу только, что строка оказалось Base64 (определить это можно по символам + / и = на конце).

Декодируем строку:

import base64
answer = base64.b64decode(answer)



Если мы ее выведем, то заметим что в конце получившейся строки у нас есть заголовок окончания PNG изображения IEND:
\xdec\xd6\x00\x00\x00\x00IEND\xaeB`\x82


Проверим нашу теорию, посмотрим начало строки и:
\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00


Точно! Нам дано изображение, закодированное в строку base64!

Напишем программу для создания изображения:


f = open('shades1.png','w')
f.write(answer)
f.close()


В итоге мы получили еще одно изображение с серыми пикселями:
Basic Images - TJCTF2016


Далее решение сводится к тому, чтобы повторять предыдущие действия пока в итоге после декодирования Base64 мы не получим флаг.

Все получившиеся изображения(включая начальное):

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

Basic Images - TJCTF2016

В общей сложности данное действие повторили 7 раз.
И после декодирования последнего изображения получаем флаг:

FLAG: tjctf{asc11_c0l0r_inc3pt1on}

P.S. Конечно можно было это автоматизировать, но мне было легче прогнать вручную программу 8 раз меняя некоторые параметры:)скачать dle 10.5фильмы бесплатно

  • Автор: drakylar
  • Комментарии: 0
  • Просмотры: 3126

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!