Fetch the Flag CTF 2022: Write-up zu Treasure Trove
Luke Watts
10. November 2022
0 Min. LesezeitVielen Dank, dass Sie mit uns Fetch gespielt haben! Glückwunsch an die Tausenden Spielerinnen und Spieler, die bei Fetch the Flag CTF dabei waren. Und ein riesiges Dankeschön an die Snykers, die die Herausforderungen entwickelt, getestet und dokumentiert haben!
Fetch the Flag war dieses Jahr ein Riesenspaß, aber auch mit viel Arbeit verbunden! Bei 16 Herausforderungen und begrenzter Zeit konnte nicht jedes Team alle lösen. Wenn Sie die Zeit nicht geschafft haben, sehen wir uns an, wie unser Team die Herausforderung Treasure Trove angegangen ist.
Schritt-für-Schritt-Anleitung
Die Aufgabenstellung lautete: „Der neueste Treasure Trove ist da, aber wo habe ich meinen Lizenzschlüssel hingelegt?“ Als Einstieg gibt es einen Tag mit der Bezeichnung Reverse Engineering sowie eine bereitgestellte Datei obfuscator.js.
Außerdem ist eine Website verlinkt. Sie enthält Eingabefelder für 5 × 5 Zeichen, eine Schaltfläche und ein großartiges Artwork, das mich an das Spielen von Curse of Monkey Island erinnert.

Wenn Sie sich den bereitgestellten Code ansehen, finden Sie ein Tool, das menschenlesbaren Code in unverständlichen Code umwandelt.
Sehen wir uns als Nächstes die Website an. Dort gibt es einen swashbuckle.js-Endpunkt mit einer Methode namens validate. Der dortige Code scheint mit der Ausgabe übereinzustimmen, die der Obfuscator erzeugt. Hmm …
Bei genauerem Hinsehen erkennen wir, dass die Methode validate im Window verfügbar ist und beim Absenden des Formulars aufgerufen wird. Oh wow, Reverse Engineering von validate scheint der einzige Weg zu sein … Vielleicht kann der Browser helfen? Rufen wir validate.toString() über die Browserkonsole auf. Bingpot!
Offenbar führt der Code die folgenden Schritte aus:
Ruft die Werte aus den HTML-Eingabefeldern ab
Prüft, ob die Zeichen dem Bereich
A-Z0-9entsprechenDurchläuft die Zeichen, wandelt sie in einen
charCodeum und addiert die Werte. DiecharCodeAt()-Methode gibt eine Ganzzahl zwischen 0 und 65535 zurück, die die UTF-16-Codeeinheit am angegebenen Index darstellt. QuelleLöst einen Fehler aus, wenn der Wert nicht 1800 entspricht
Wenn der Wert 1800 entspricht, werden die ursprünglichen Eingabewerte an einen API-Endpunkt gesendet
Die wichtigste Erkenntnis: Solange der Wert nicht 1800 beträgt, ist der Code ungültig.
1800 / 25 (die Gesamtzahl der verfügbaren Zeichen)
72
String.fromCharCode(72)Gibt H zurück
In jedes Eingabefeld HHHHH eingeben

Doppel-Bingpot!

Wir konnten diese Herausforderung lösen, ohne uns mit der Codebasis des Obfuscators befassen zu müssen. So blieb uns genug Zeit, mit der nächsten Herausforderung zu beginnen!
Möchten Sie wissen, wie wir alle anderen Flags gefunden haben? Auf unserer Seite Fetch-the-Flag-Lösungen erfahren Sie, wie wir dabei vorgegangen sind.
