Bei dieser Challenge (ppc 100) geht es um eine RTF-Datei. Das Rich Text Format ist ein altes, von Microsoft entwickeltes, proprietäres Dateiformat zur Darstellung von Textdokumenten. Ein erster Blick in das Dokument mit LibreOffice offenbart uns diesen Inhalt:
Offensichtlich handelt es sich um ein offizielles, von der Australischen Regierung herausgegebenes 11-seitiges Dokument zur Weltraumpolitik. Die weitere Betrachtung in LibreOffice lässt keine Auffälligkeiten erkennen.
Ein RTF-Dokument wird jedoch in der Datei selbst mit programmiersprachenähnlichen Code-Blöcken beschrieben, weshalb sich ein Blick in die Datei selbst durchaus lohnt. Neben ganz “normalen” Anweisungblöcken, wie zum Beispiel:
\styrsid489982 Heading 1 Char;}{\*\cs24 \additive
… finden sich auch sehr Auffällige Blöcke, wie dieser:
{\*\volgactf412 JAQQnQECTB0KnUkZSK8xCMNZw/flr3799PyZU8O5DTNheDBwX
qopApfP4Kakq0jSUceLbRqlDIM0a8vpDkIEwKbTNJGRd6oqQmRTuwJ+kwarG2vT
[...]
Das Tag “VolgaCTF” kann kein Zufall sein! Von diesen Anweisungen gibt es mehrere Hundert Stück, jeweils gefolgt von einer Zeichenkombination, die auf den ersten Blick sehr nach Base64 aussieht. Die Zahl, die sich Hinter dem VolgaCTF-Tag befindet, könnte dabei für die Postion des Blockes stehen.
Die vermutete Lösungsweg zur Challenge ist daher, alle VolgaCTF-Blöcke aus dem RTF-Dokument zu extrahieren, entsprechend der vorhandenen Zahl zu sortieren und anschließend die Base64-Teile zusammen zu fügen. Diese Funktionalität implementieren wir ein Perl-Skript:
#!/usr/bin/perl open(FILE, "ppc100.rtf"); @file = <FILE>; close(FILE); $file = join("", @file); $ctf = "volgactf"; $base64 = ""; for ($pos=0;$pos<=1000;$pos++) { $search = $ctf . $pos . " "; $index = index($file, $search); if ($index != -1) { print "Found $pos\n"; $end = index($file, "}", $index+length($search)); $part = substr($file, $index+length($search), $end-$index-length($search)); $base64 .= $part; } } open(RES, ">result.b64"); print RES $base64; close(RES);
Das Ausführen des Skriptes liefert die Datei “result.b64”, die nun mit dem Konsolenkommando “base64” decodiert werden kann:
rup0rt@lambda:~/VolgaCTF2013/ppc100$ ./ppc100.pl rup0rt@lambda:~/VolgaCTF2013/ppc100$ base64 -d result.b64 > rtf rup0rt@lambda:~/VolgaCTF2013/ppc100$ file rtf rtf: PNG image data, 1024 x 682, 8-bit/color RGBA, non-interlaced rup0rt@lambda:~/VolgaCTF2013/ppc100$ mv rtf rtf.png
Das Ergebnis ist ein PNG-Bild, das wie folgt aussieht:
Die Lösung lautet somit: “Y0_d4wg_w3_h3rd_y0u_lik3_pl4y1ng_c+f!“.