Задание:
У нас есть несколько повреждённых файлов. Формат флага — “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