VolgaCTF 2013 – ppc 100

VolgaCTF 2013 - PPC 100 - task description

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:

VolgaCTF 2013 - PPC 100 - RTF file view

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:

VolgaCTF 2013 - PPC 100 - solution

Die Lösung lautet somit: “Y0_d4wg_w3_h3rd_y0u_lik3_pl4y1ng_c+f!“.

Leave a Reply

Your email address will not be published. Required fields are marked *