Disclaimer: Im August 2026 fand die Qualifikation für das Finale von Deutschlands Bester Hacker statt, welches ich auf Platz 1 abschließen konnte. Nur zwei Teilnehmer waren in der Lage, alle Challenges zu lösen. Dieses Writeup wurde mit KI auf Basis meiner Notizen erstellt und kann Fehler enthalten, bei Fragen bitte direkt an mich wenden im DBH-Discord.
| Wettbewerb | Deutschlands Bester Hacker 2026 — Qualifikation |
| Kategorie | ReversingReverse EngineeringAnalyse eines Systems oder Programms zur Rekonstruktion seiner Funktionsweise. |
| Punkte | 50 |
| Angriffsklasse | Statisches Reversing / XOR-obfuskierte Strings |
| Flag | DBH{V0LLV3RS10N_FR31G3SCH4LT3T} |
Die Challenge
Auf einer alten Diskettensammlung findet sich Turbo Racer ’95 von Blitzsoft Interactive — ein Rennspiel in einer Shareware-Version. Zwei von zwölf Strecken sind freigeschaltet, der Rest soll über einen Code von einer Registrierungskarte aktiviert werden.
Die Karte ist seit dreißig Jahren verschollen, Blitzsoft Interactive existiert ebenfalls nicht mehr. Ziel ist es, den alten Freischaltmechanismus zu untersuchen und die Flag zu finden.
Aufklärung
Zuerst die bereitgestellte Datei untersuchen:
file turbo-racer
Obwohl die Story ein altes DOS-Spiel nahelegt, ist die Datei tatsächlich ein Linux-ELF-Binary. Außerdem ist es nicht gestripped — Funktionsnamen sind erhalten, was die Analyse erheblich erleichtert.
Besonders auffällig:
pruefe_code
entschluessle
zeige_vollversion
Diese Namen geben die Programmlogik praktisch vor:
pruefe_codeprüft den eingegebenen Freischaltcode.entschluessledekodiert versteckte Strings.zeige_vollversiongibt nach erfolgreicher Prüfung die Vollversionsmeldung aus.
Die Schwachstelle
Mit einem Disassembler beziehungsweise Decompiler ist erkennbar, dass das Programm verschlüsselte Bytefolgen in den Datenbereichen enthält, die zur Laufzeit mit einer einfachen XOR-Operation entschlüsselt werden.
entschluessle arbeitet nach dem Prinzip:
output[i] = input[i] ^ key;
Das ist keine komplexe VerschlüsselungEncryptionWandelt Klartext mithilfe eines Schlüssels in nicht lesbaren Geheimtext um., sondern eine klassische XOR-ObfuskationObfuscationErschwert die Analyse von Code, Daten oder Kommunikation durch absichtliche Verkomplizierung. — und die lässt sich vollständig statisch rückgängig machen, ohne das Programm je auszuführen.
Der Angriff
In pruefe_code wird eine verschlüsselte Zeichenkette mit dem Schlüssel 0x5a
entschlüsselt und mit der Benutzereingabe verglichen. Entschlüsselt ergibt sich der gültige
Freischaltcode:
TURBO95-VOLLGAS
Nach erfolgreicher Codeprüfung ruft das Programm zeige_vollversion auf. Auch dort liegt
die relevante Ausgabe nicht im Klartext vor, sondern XOR-verschlüsselt im Binary — diesmal
mit dem Schlüssel 0x33.
Dieselbe XOR-Logik auf die dort gespeicherte Bytefolge angewendet, ergibt die Registrierungskennung beziehungsweise Flag.
Die Flag
Der korrekte Freischaltcode für Turbo Racer ’95 lautet:
TURBO95-VOLLGAS
Und die Flag:
DBH{V0LLV3RS10N_FR31G3SCH4LT3T}
Was ich mitnehme
Die Challenge nutzt eine klassische Shareware-Story als Rahmen für eine einfache
Reverse-Engineering-Aufgabe. Der wichtigste Hinweis war, dass das Binary nicht gestripped
war — sprechende Funktionsnamen wie pruefe_code, entschluessle und zeige_vollversion
ersparen die halbe Analyse.
Technisch bestand die Aufgabe darin, die XOR-verschlüsselten Strings im Binary zu erkennen
und mit den passenden Schlüsseln zu entschlüsseln. Dadurch ließen sich sowohl der
Freischaltcode als auch die finale Flag ohne jedes dynamische Debugging extrahieren. Wer nur
strings laufen lässt, sieht davon nichts — die Werte werden erst zur Laufzeit lesbar.