/Разборы задач
7 ноября 2026
Райтап на задачу «Двери»
Авторский разбор задачи «Двери»: принцип Port Knocking, поиск слушателя в подсети и последовательное открытие трёх TCP-портов.19
6

Misc
Задача «Испорченное селфи»
Дано: мешанина пикселей и сервис, который её создал. По описанию ясно, что сервис просто переставляет пиксели местами и делает это с любым изображением, которое мы подаём ему на вход:
Основная трудность в решении этой таски — понять, какой пиксель в какое место устанавливает сервис, не имея его исходников. Главная задача — путём проб и ошибок прийти к правильной идее, которая была заложена автором. Начнём с простого эксперимента: создадим в GIMP и загрузим в сервис изображение ровно из 4 пикселей уникальных цветов:
И сравним с выводом миксера:
Значения цветов до перемешивания и после идентичны, а значит, если залить изображение разрешением, равным нашей перемешанной картинке, на выходе мы получим полную карту перестановок пикселей. Не забываем про главное условие — каждый пиксель в созданном изображении должен быть уникальным. Разрешение нашей картинки — 1024 × 1024. Важное ограничение — в RGB 16 777 216 цветов. 1024 × 1024 = 1 048 576 < 16 777 216 — проходим. Ручками или с помощью любимой LLM соберём скрипты на PIL сперва для генерации изображения-карты:
import numpy as np
from PIL import Image
photo_path = "selfie.png"
output_path = "probe.png"
with Image.open(photo_path) as image:
width, height = image.size
ids = np.arange(width * height, dtype=np.uint32).reshape(height, width)
probe = np.stack([
ids & 255,
(ids >> 8) & 255,
ids >> 16
], axis=-1).astype(np.uint8)
Image.fromarray(probe).save(output_path)Загрузим результат в сервис и получим карту перестановок, а затем напишем скрипт для «размешивания» нашей картинки по карте:
import numpy as np
from PIL import Image
photo = np.array(Image.open("selfie.png").convert("RGB"))
probe = np.array(Image.open("probe_shuffled.png").convert("RGB"))
pixels = probe.reshape(-1, 3).astype(np.uint32)
ids = pixels[:, 0] | (pixels[:, 1] << 8) | (pixels[:, 2] << 16)
restored = np.empty_like(photo.reshape(-1, 3))
restored[ids] = photo.reshape(-1, 3)
Image.fromarray(restored.reshape(photo.shape)).save("result.png")Запускаем солвер и сдаём флаг!