Кубок CTF России

Разбор: My Own FS с отбора X Кубка CTF

Условие: forensics с меткой beginner. Дан образ диска disk.img и исходники самописной файловой системы на FUSE. По таблице организаторов задание решили 586 раз.

Устройство

  • Список занятости инодов: по байту на инод, 0 — свободен, 1 — занят
  • Иноды по 1337 байт
  • Каждый инод начинается с указателя на следующий инод файла и байта типа
  • Первый инод файла хранит метаданные

Генератор кладёт flag.png на глубину 5 и больше, перемешивает иноды и удаляет каталоги в корне. При удалении иноды лишь помечаются свободными, содержимое не затирается.

Ход решения

  • По исходникам понять формат
  • Пройти по всем инодам, включая свободные
  • Найти головной инод типа 1, данные которого начинаются с сигнатуры PNG
  • Взять размер из заголовка
  • Собрать файл по указателям next

Что вынести

Удаление часто стирает ссылку, а не данные. Читать подряд нельзя, но цепочка указателей уцелела.

Пример

Пример условный. Команда пишет парсер на 40 строк: сначала печатает все головные иноды и их первые байты, а уже потом собирает файл. Так ошибка в смещении видна сразу.

Важно. После монтирования видны только README.txt и todo.txt. Работайте с образом напрямую, а не через смонтированный каталог.

Для разбора в команде

  • ☐ Формат выписан по исходникам
  • ☐ Проверены свободные иноды
  • ☐ Файл собран по цепочке
  • ☐ Скрипт сохранён

Что сработало и какой скрипт сохранить, запишите в шаблон разбора 👇

Основание: условие и решение авторов задачи, репозиторий acisoru/ctfcup2026-quals, forensics/my-own-fs. Канал не принадлежит организаторам; официальный сайт — ctfcup.ru.

Первоисточник