Обновить

Комментарии 1

Сейчас проверил и оказалось, что эти задания легко пройти при помощи LLM. Кроме куба, конечно.

Закинул HEX из hidden_payload в чат с GPT и она мне выдала сразу все 2 флага за 13 минут и рассказала как их получить.

Ответ ChatGPT

Нашёл два флага:

  1. OFFZONE{Th1s_1s_0nly_Th3_B3g1nn1ng_A7E6FE25}

  2. OFFZONE{Y0u_D1d_1t_B578E7F3}

1. HEX → Base64

Из таблицы нужно оставить только шестнадцатеричные строки, объединить их и декодировать:

grep -Eo '[0-9A-Fa-f]{64}' input.txt |
    tr -d '\n' |
    xxd -r -p > layer1.b64

Начало результата:

UEsDBBQAAAAAAAAAIQ...

UEsDB — характерное начало ZIP, закодированного в Base64:

base64 -d layer1.b64 > outer.zip
file outer.zip

Получаем:

Zip archive data

2. Повреждённый ZIP

При проверке архива возникает ошибка:

unzip -t outer.zip
bad CRC f8da00e2 (should be 71578a5d)

Архив содержит один файл:

badge.jpg

В Base64 намеренно изменён регистр одного символа. На смещении 582 находится O, хотя должно быть o:

...AEJYWVOg...
         ^
...AEJYWVog...

Исправляем:

python3 - <<'PY'
from pathlib import Path

data = bytearray(Path("layer1.b64").read_bytes())

assert data[582] == ord("O")
data[582] = ord("o")

Path("layer1.fixed.b64").write_bytes(data)
PY

base64 -d layer1.fixed.b64 > outer.fixed.zip
unzip -t outer.fixed.zip
unzip outer.fixed.zip

Теперь CRC совпадает:

badge.jpg OK
No errors detected

Повреждение затрагивало ICC-профиль JPEG: сигнатура XYS\xa0 после исправления превращается в нормальную XYZ . Совпадение CRC 71578a5d подтверждает, что замена правильная.

3. Первый флаг — EXIF

Смотрим метаданные изображения:

exiftool -Copyright badge.jpg

Результат:

Copyright : OFFZONE{Th1s_1s_0nly_Th3_B3g1nn1ng_A7E6FE25}

Или через ImageMagick:

identify -format '%[EXIF:Copyright]\n' badge.jpg

Первый флаг:

OFFZONE{Th1s_1s_0nly_Th3_B3g1nn1ng_A7E6FE25}

4. Данные после конца JPEG

Проверяем сигнатуры внутри файла:

grep -aob $'\xff\xd9' badge.jpg
grep -aob $'PK\x03\x04' badge.jpg

Получаем:

1072: JPEG EOI
1074: PK...

Маркер FF D9 завершает JPEG на смещении 1074, а сразу после него начинается ещё один ZIP. Вырезаем его:

dd if=badge.jpg of=inner.zip bs=1 skip=1074 status=none
unzip -l inner.zip

Внутри один файл:

text.txt

Извлекаем содержимое:

unzip -p inner.zip text.txt
pHsL5tvBiZEsLNpeUcfUXyKZhSbxRn3eUJ4p1z

5. Base58 → второй флаг

Строка использует алфавит Base58: в ней нет неоднозначных символов 0OI и l.

Декодировать можно в CyberChef операцией From Base58 либо Python:

s = "pHsL5tvBiZEsLNpeUcfUXyKZhSbxRn3eUJ4p1z"
alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

number = 0
for char in s:
    number = number * 58 + alphabet.index(char)

result = number.to_bytes((number.bit_length() + 7) // 8, "big")
print(result.decode())

Результат:

OFFZONE{Y0u_D1d_1t_B578E7F3}

Дополнительная проверка ZIP-полей, ICC, пиксельных LSB и Steghide-структур других флагов не выявила. Итог — два флага.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации