1.7 KiB
Summer Vacations
На входе — картинка vacation.png. Если провести классический LSB-скан по красному каналу, тогда быстро находится читаемая строка, похожая на флаг — и это ловушка. Настоящий флаг расположен в младшем бите альфа-канала.
Решение
Открываем картинку в RGBA (принудительно, чтобы гарантированно получить альфа-канал) и проходим по пикселям в растровом порядке (слева направо, сверху вниз). Для каждого пикселя проверяем условие:
(R * G * B) % 7 == 3
Только те, что прошли фильтр, несут бит данных — и из них забираем младший бит альфа-канала:
if (r * g * b) % 7 == 3:
bits.append(a & 1)
Накопленные биты группируем по 8 (старший бит первым) и собираем в байты. Нулевой байт — маркер конца данных, аналог \0-терминатора в C. Принимаем только печатаемые ASCII (0x20–0x7E); всё остальное — либо конец флага, либо мусор.
Готовый солвер — solve/solver.py.
Флаг
caplag{p4t13nc3_r3v34ls_truth}