/Разборы задач
8 ноября 2026
Райтап на задачу «Мозаика внутри PNG»
Исследуем некорректные чанки PNG, находим спрятанные части флага и собираем их в правильном формате.42
73

Stegano
Задача «Мозаика внутри PNG»
Отличный таск, так ещё и стега) Нам дана картинка, сразу же проверяем её формат:
Ага, это PNG. А после того, как мы видим PNG в стеге, сразу чешутся ручки посмотреть вывод утилиты pngcheck:
Или через https://aperi.bug-makers.ru/:
В любом случае мы натыкаемся на ошибку, которая говорит нам о том, что тут есть чанк с невалидным именем «pT69». Теперь, вспоминая слова автора, что флаг где-то внутри файла, мы открываем его через xxd и смотрим начало:
Видим «flag into bugctf» и т. д. Теперь мы поняли, куда копать, можно и посмотреть вывод strings:
Вот и наш bugctf{}. Теперь слегка расширим границы наших поисков и посмотрим через od:
Видим первую часть нашего флага, понимаем, что придётся парсить чанки вручную, т. к. строгие валидаторы по типу pngcheck не пропускают невалидные чанки. Поэтому пишем небольшой парсер прямиком в терминале:
import struct
d = open("dabro_bro(1).png", "rb").read()
i = 8
c = []
while i < len(d):
l = struct.unpack(">I", d[i:i + 4])[0]
t = d[i + 4:i + 8]
c.append((t, d[i + 8:i + 8 + l]))
i += 12 + l
if t == b"IEND":
break
print(b"".join(
x[1] for x in sorted(
(x for x in c if x[0][:2] == b"pT"), key=lambda x: x[0]
)
).decode("utf-8", "replace"))Теперь читаем увлекательную статью из Википедии и собираем по частям флажок)
Вариант номер 2 (для ленивых):
Т. к. вся суть задания в том, чтобы прочитать чанки, то мы можем воспользоваться утилитой zsteg. Тут тоже есть разнообразие: мы можем это делать либо в терминале, либо зайти на любимый https://aperi.bug-makers.ru/ и посмотреть вывод этой утилиты там.
Это уже более извращённый способ, но, возможно, есть любители ломать.
Другие решения этой задачи: