Deutschlands Bester Hacker - Cheatcode (Reversing) - Das Writeup

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_code prüft den eingegebenen Freischaltcode.
  • entschluessle dekodiert versteckte Strings.
  • zeige_vollversion gibt 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.