Basic Images - TJCTF2016
Задание: дана картинка и требуется найти флаг.
Первое, на что мы должны обратить внимание, так это название таска "Grey Shades" - оттенки серого. А тк у нас картинка .PNG (то есть она не сжата), вероятнее всего была работа с отдельно взятыми серыми пикселями.
Откроем это изображение в любом редакторе (советую привыкать к Photoshop), позволяющем посмотреть точный цвет пикселя и видим следующее:
Наши цвета колеблются от 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()
В итоге мы получили еще одно изображение с серыми пикселями:
Далее решение сводится к тому, чтобы повторять предыдущие действия пока в итоге после декодирования Base64 мы не получим флаг.
Все получившиеся изображения(включая начальное):
В общей сложности данное действие повторили 7 раз.
И после декодирования последнего изображения получаем флаг:
FLAG: tjctf{asc11_c0l0r_inc3pt1on}
P.S. Конечно можно было это автоматизировать, но мне было легче прогнать вручную программу 8 раз меняя некоторые параметры:)
- Автор: drakylar
- Комментарии: 0
- Просмотры: 3401