# My Own FS | forensics, filesystem, beginner **Автор:** — ## Описание > Who said filesystems have to be hard? Recovering deleted files on the other hand. ## Деплой Не требуется. ## Выдать участникам Только [public/my-own-fs.zip](public/my-own-fs.zip) (образ `disk.img` и исходники ФС). ## Идея Самописная ФС на FUSE (Rust, [src/myfs](src/myfs)). Устройство делится на список занятости инодов (по байту на инод, 0 — свободен, 1 — занят) и иноды по 1337 байт. Каждый инод начинается с указателя на следующий инод файла (0 — конец файла) и байта типа; первый инод файла дополнительно хранит его метаданные (mode, uid, gid, size, времена, nlink). Каталоги — файлы со списком записей «номер инода, длина имени, имя». Инод 0 — корневой каталог. Генератор [src/gen.py](src/gen.py) монтирует образ, создаёт случайное дерево каталогов с мелкими файлами и кладёт `flag.png` с флагом на глубину 5+. Затем образ отмонтируется, иноды 1..N случайно переставляются (`myfs shuffle`, ChaCha20 с ключом из системного ГСЧ) с переписыванием всех указателей, и после повторного монтирования все каталоги в корне удаляются. При удалении иноды лишь помечаются свободными, содержимое не затирается. Пересборка раздатки: [build_public.sh](build_public.sh) (вызывает `src/gen.py`; нужны cargo, fusermount3, Pillow). Каждый запуск даёт новый случайный образ. ## Решение По исходникам понять формат. Смонтировав образ, видно только `README.txt` и `todo.txt` — каталоги удалены. Поэтому нужно пройти по всем инодам (в том числе свободным), найти головной инод (тип 1), данные которого начинаются с сигнатуры PNG, взять размер из его заголовка и собрать файл, следуя по указателям `next`. Иноды перемешаны, так что читать их подряд нельзя, но цепочка указателей при удалении сохраняется. Готовый решатель: [solve/solve.py](solve/solve.py). Подробный разбор: [solve/WRITEUP.md](solve/WRITEUP.md). ## Флаг ``` ctfcup{dbf75e112fef01db44b2a0e68ab2065e} ```