Init. commit
This commit is contained in:
30
stego-summer-vacations/WRITEUP.md
Normal file
30
stego-summer-vacations/WRITEUP.md
Normal file
@@ -0,0 +1,30 @@
|
||||
<h1 align="center">Summer Vacations</h1>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/badge/category-Stego-blueviolet" alt="Stego"/>
|
||||
<img src="https://img.shields.io/badge/points-799-yellow" alt="799 pts"/>
|
||||
</p>
|
||||
|
||||
На входе — картинка `vacation.png`. Если провести классический LSB-скан по красному каналу, тогда быстро находится читаемая строка, похожая на флаг — и это ловушка. Настоящий флаг расположен в младшем бите альфа-канала.
|
||||
|
||||
## Решение
|
||||
|
||||
Открываем картинку в RGBA (принудительно, чтобы гарантированно получить альфа-канал) и проходим по пикселям в растровом порядке (слева направо, сверху вниз). Для каждого пикселя проверяем условие:
|
||||
|
||||
```text
|
||||
(R * G * B) % 7 == 3
|
||||
```
|
||||
|
||||
Только те, что прошли фильтр, несут бит данных — и из них забираем младший бит альфа-канала:
|
||||
|
||||
```python
|
||||
if (r * g * b) % 7 == 3:
|
||||
bits.append(a & 1)
|
||||
```
|
||||
|
||||
Накопленные биты группируем по 8 (старший бит первым) и собираем в байты. Нулевой байт — маркер конца данных, аналог `\0`-терминатора в C. Принимаем только печатаемые ASCII (`0x20`–`0x7E`); всё остальное — либо конец флага, либо мусор.
|
||||
|
||||
Готовый солвер — [`solve/solver.py`](solve/solver.py).
|
||||
|
||||
## Флаг
|
||||
`caplag{p4t13nc3_r3v34ls_truth}`
|
||||
Reference in New Issue
Block a user