CSAW CTF Qualifiers 2012 –
Reversing 200

Ohne viel Aufgabenbeschreibung wird bei dieser Challenge (Reversing 200) nur eine .EXE-Datei bereit gestellt. Diese näher zu betrachten und daraus irgendwie einen Weg zum Schlüssel der Challenge erkennen zu können, wird demnach den ersten Schritt darstellen. Wir beginnen damit, uns die Art der Executable detaillierter anszusehen.

rup0rt@lambda:~/CSAW2012$ file CSAWQualificationEasy.exe 
CSAWQualificationEasy.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

Es handelt sich also um eine ausführbare Datei, die mit Hilfe des Microsoft .NET-Frameworks bzw. des quelloffenen mono-Frameworks erstellt wurde. Der erste Gedanke, der uns bei .NET-Binarys immer kommen sollte ist, dass sich solche Dateien relativ unproblematisch decompilen und so in den ursprünglichen Quellcode überführen lassen.

Wir starten also eine geeignete Virtuelle Maschine – ich verwende hier ein Windows XP – Service Pack 3 unter VirtualBox. Auch wenn man fremde Binarys nie einfach so ausführen sollte, bin ich immer neugierig und in einer virtuellen Maschine darf man sich so etwas schonmal erlauben ;-). Das Ergebnis sieht folgendermaßen aus:

CSAW CTF 2012 - Reversing 200 - normal execution

Der Text deutet an, dass eine Berechnung im Hintergrund statt findet, der Autor nur vergessen hat, das eigentliche Ergebnis danach auch auf dem Bildschirm ausgeben zu lassen. Es wird also Zeit, das Decompiling durchzuführen und den Quellcode dieses Programmes genauer zu untersuchen.

Ich verwende dafür den open-source Decompiler ILSpy. Nach der Verarbeitung des Binarys finden wir folgenden Quellcode vor:

CSAW CTF 2012 - Reversing 200 - decompiled binary

Das Programm beinhaltet also ein “verschlüsseltes” Array namens “encrypted”, bei dem jedes Element in der for-Schleife mit der Operation XOR 255 verknüpft wird, um die “Entschlüsselung” durchzuführen. Anschließend wird jedoch, wie das Programm schon andeutet, vergessen, den entschlüsselten String (arg) auszugeben.

Wir könnten nun den Quellcode um ein “Console.WriteLine(arg);” ergänzen, neu compilieren und anschließend erneut ausführen um den Inhalt des entschlüsselten Textes zu erhalten. Leider bin ich zu faul, nur dafür das Visual Studio Express für C# zu installieren, wobei die Installation selbst schon ewig dauern würde.

Daher möchte ich das Programm lieber kurz in C umschreiben (das werden nur ein paar Handgriffe sein) und so mit der GNU Compiler Collection (GCC) relativ schnell ein Ergebnis erhalten können. Der Quellcode kann größtenteils per Copy&Paste übertragen werden und nach ein paar geringen Anpassungen, ergibt sich folgender C-Sourcecode:

#include <stdio.h>

char array[] = { ... };  // direkt aus C# kopiert

int main() {
  int i;

  for (i = 0; i < sizeof(array); i++) {
    printf("%c", array[i] ^ 255);
  }
  printf("\n");
  return(0);
}

Nun können wir den GCC verwenden um per Kompilierung eine ausführbare Datei zu erhalten und so den Schlüssel zur Lösung der Challenge ablesen.

rup0rt@lambda:~/CSAW2012$ gcc rev200.c -o rev200
rup0rt@lambda:~/CSAW2012$ ./rev200
The key is 9c09f8416a2206221e50b98e346047b7

Es entsteht ein sinnvoller Text, was uns zeigt, dass die “Entschlüsselung” erfolgreich war und unser Vorgehen die Aufgabe lösen konnte!

Das Ergebnis lautet somit “9c09f8416a2206221e50b98e346047b7“.

Leave a Reply

Your email address will not be published.