
Комментарии 1
Сейчас проверил и оказалось, что эти задания легко пройти при помощи LLM. Кроме куба, конечно.
Закинул HEX из hidden_payload в чат с GPT и она мне выдала сразу все 2 флага за 13 минут и рассказала как их получить.
Ответ ChatGPT
Нашёл два флага:
OFFZONE{Th1s_1s_0nly_Th3_B3g1nn1ng_A7E6FE25}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 data2. Повреждённый ZIP
При проверке архива возникает ошибка:
unzip -t outer.zipbad 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.txtpHsL5tvBiZEsLNpeUcfUXyKZhSbxRn3eUJ4p1z5. Base58 → второй флаг
Строка использует алфавит Base58: в ней нет неоднозначных символов 0, O, I и 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-структур других флагов не выявила. Итог — два флага.
CTF на шее: разбираем задания бейджа OFFZONE 2026