Задание:
У нас есть несколько повреждённых файлов. Формат флага — “RUCTF_.*”
Итак, нам дан архив с поврежденными файлами. Сразу с первого взгляда стало понятно, что это файлы базы mongodb. Первый очевидный вариант – запустить демон монги с опцией –repair. Но,к сожалению, монго упала и отказалась далее запускаться. Следующей идеей было попробовать ресторнуть базу при помощу mongodump с опцией –dbpath (дело в том, что mongodump может сделать дамп без запущенного демона). Но он упал с такой же ошибкой. При добавлении опции –repair получилась все же уже другая ошибка, но немного данных все же было получено. Сделав mongorestore, получил схему бд.
# mongorestore dump connected to: 127.0.0.1 Wed Mar 12 14:52:35 dump/ructf/letters.bson Wed Mar 12 14:52:35 going into namespace [ructf.letters] 8 objects found Wed Mar 12 14:52:35 dump/ructf/system.indexes.bson Wed Mar 12 14:52:35 going into namespace [ructf.system.indexes] Wed Mar 12 14:52:35 { key: { _id: 1 }, ns: "ructf.letters", name: "_id_" } Wed Mar 12 14:52:35 { key: { _id: 1 }, ns: "ructf.letters", name: "_id_" } 2 objects found # mongo MongoDB shell version: 2.0.6 connecting to: test > use ructf switched to db ructf > db.getCollectionNames() [ "letters", "system.indexes" ] > db.letters.find() { "_id" : ObjectId("530a0532de56321a507b64e4"), "Position" : 21, "Letter" : 53 } { "_id" : ObjectId("530a0536de56321a507bd6ee"), "Position" : 36, "Letter" : 70 } { "_id" : ObjectId("530a0536de56321a507bd6cf"), "Position" : 10, "Letter" : 50 } { "_id" : ObjectId("530a0536de56321a507bce49"), "Position" : 20, "Letter" : 66 } { "_id" : ObjectId("530a0536de56321a507bce46"), "Position" : 6, "Letter" : 67 } { "_id" : ObjectId("530a0536de56321a507bce20"), "Position" : 19, "Letter" : 55 } { "_id" : ObjectId("530a0535de56321a507bc868"), "Position" : 5, "Letter" : 95 } { "_id" : ObjectId("530a0535de56321a507bbe80"), "Position" : 35, "Letter" : 55 } >
Дальнейшие эксперименты с опциями ни к чему не привели. После чего я пришел к отчаянной мере – вручную написать свой дампер по спецификации. Все оказалось достаточно просто – эти файлы собой представляют напрямую bson-объекты. Немного покурив http://bsonspec.org/#/specification и посмотрев файл в WinHex, я написал небольшой скрипт. Для упрощения жизни себе я искал вхождение строки Position, далее позиционировался относительно него т.к. имена полей и их тип (Integer) совпадали (к счастью ;) ).
<?php $f=file_get_contents('ructf.0'); $idx=strpos($f,'Position'); $ans=" "; while($idx>0){ $idPos=$idx+9; $idLetter=$idPos+12; $idFlag=$idPos-31; if(ord($f[$idFlag])==48){ $ans[ord($f[$idPos])]=$f[$idLetter]; } $idx=strpos($f,'Position',$idLetter); } echo $ans; ?>
➜ nosql.7a213eefd016dadea7e9d793271ad504 php ructf.php RUCTF_CFDE28B7B90447B582F82B7B9056B7F1
Leave a Reply