Programming lesson
Binary Bomb entschärfen in CSCI 247: Debugging mit GDB und Reverse Engineering
Lerne, wie du mit GDB und Reverse Engineering die Binary Bomb aus CSCI 247 entschärfst. Schritt-für-Schritt-Anleitung für Projekt 2 – inklusive Tipps zu Assembly, Breakpoints und Registeranalyse.
Binary Bomb entschärfen: Deine Mission im CSCI 247 Projekt 2
Stell dir vor, Dr. Evil hat eine geheime Bombe auf den Uni-Rechnern platziert – und du bist der einzige, der sie entschärfen kann. Genau das ist die Aufgabe im CSCI 247 Computer Systems I Projekt 2: Defusing Binary Bomb. Jede Phase der Bombe erwartet eine bestimmte Eingabe, sonst explodiert sie mit „BOOM!!!“. In diesem Tutorial lernst du, wie du mit GDB (GNU Debugger) und Reverse Engineering systematisch vorgehst, um jede Phase zu knacken – ohne Brute-Force.
Was ist eine Binary Bomb?
Eine Binary Bomb ist ein ausführbares Programm, das aus mehreren Phasen besteht. Jede Phase prüft eine Eingabe (String) auf Richtigkeit. Ist die Eingabe falsch, explodiert die Bombe und du verlierst Punkte. Das Ziel: alle Phasen entschärfen, indem du die korrekten Strings findest. Das Besondere: Du musst den Quellcode nicht sehen – du analysierst die Assembly-Instruktionen und den Speicher des Programms.
Warum ist Reverse Engineering heute relevant?
Reverse Engineering wird nicht nur in der akademischen Welt genutzt, sondern auch in der Cybersecurity, bei der Analyse von Malware oder beim Hacken von Spielen. Sogar in der KI-Entwicklung wird es eingesetzt, um neuronale Netze zu verstehen. Aktuell, im Juni 2026, ist Reverse Engineering ein heißes Thema in der KI-Sicherheit – Forscher zerlegen Modelle, um Schwachstellen zu finden. Genau diese Fähigkeiten trainierst du hier.
Erste Schritte: Die Bombe herunterladen und entpacken
Bevor du mit dem Debuggen beginnst, musst du deine persönliche Bombe erhalten. Logge dich per SSH auf den CS-Rechner ein und erstelle ein Verzeichnis:
mkdir proj2
cd proj2
curl -G http://systems.cs.wwu.edu:24701/?username=DEIN_USERNAME&[email protected]&submit=Submit > bomb.tar
tar -xvf bomb.tarNach dem Entpacken findest du einen Ordner bombk (k = deine Bombennummer) mit folgenden Dateien:
- README: Informationen zur Bombe
- bomb: Die ausführbare Binary
- bomb.c: Der Quellcode des Hauptprogramms (zeigt nur die Struktur, nicht die Lösungen)
Werkzeuge für die Bombenentschärfung
Die wichtigsten Tools sind GDB und objdump. Mit GDB kannst du das Programm Schritt für Schritt ausführen, Breakpoints setzen und Registerinhalte anzeigen. Mit objdump -d bomb erhältst du eine Disassemblierung der gesamten Binary.
GDB Grundlagen für die Binary Bomb
Starte GDB mit deiner Bombe:
gdb ./bombWichtige Befehle:
break *0xADRESSE– Setzt einen Breakpoint an einer Speicheradresserun– Startet das Programmstepi– Führt eine einzelne Assembly-Instruktion ausinfo registers– Zeigt alle Registerinhalteprint $eax– Gibt den Wert des Registers eax ausdisassemble– Disassembliert die aktuelle Funktion
Phase 1: Vergleich mit einem String
Die erste Phase ist meist einfach: Die Bombe vergleicht deine Eingabe mit einem festen String. Öffne die Binary mit objdump -d bomb und suche nach der Funktion phase_1. Du wirst einen Aufruf von strings_not_equal sehen. Setze einen Breakpoint vor diesem Aufruf und lasse dir die Argumente anzeigen:
(gdb) break *0xADRESSE_vor_dem_Aufruf
(gdb) run
(gdb) print (char*) $esiDer String in esi ist die erwartete Eingabe. Gib ihn ein und die erste Phase ist entschärft.
Phase 2: Eine Zahlenfolge
In Phase 2 musst du oft sechs Zahlen eingeben. Die Bombe liest sie mit read_six_numbers und prüft dann Bedingungen. Analysiere die Assembly: Oft wird eine Schleife durchlaufen, die prüft, ob die Zahlen bestimmte Beziehungen erfüllen (z.B. jede Zahl ist das Doppelte der vorherigen). Mit einem Breakpoint nach dem Einlesen kannst du die Zahlen im Speicher sehen:
(gdb) x/6dw $rspDas zeigt dir die sechs Zahlen als Dezimalwerte. Arbeite rückwärts: Welche Bedingungen werden geprüft? Ein typisches Muster: a[0] = 1, a[i] = a[i-1] * 2.
Phase 3: Switch-Statement
Phase 3 enthält oft ein switch-Statement. Die Eingabe ist ein Integer und ein Character. Die Bombe springt basierend auf dem Integer zu einem Teil des Codes, der dann den Character prüft. Mit GDB kannst du den Sprungtisch analysieren:
(gdb) disassemble phase_3
(gdb) break *0xADRESSE_des_switch
(gdb) run
(gdb) info registers ripNotiere dir die Adressen, zu denen gesprungen wird. Jede Adresse entspricht einem case. Lies die dortigen Vergleiche aus – so findest du die gültigen Paare (Zahl, Buchstabe).
Phase 4: Rekursive Funktion
Phase 4 testet oft dein Verständnis von Rekursion. Eine Funktion ruft sich selbst auf und du musst eine Eingabe finden, die einen bestimmten Rückgabewert liefert. Setze Breakpoints am Anfang und Ende der rekursiven Funktion und beobachte die Parameter. Ähnlich wie bei einer KI-Entscheidungslogik (z.B. in einem Chatbot) wird hier Schritt für Schritt eine Bedingung geprüft. Finde die Funktionsweise heraus – meist ist es eine mathematische Funktion wie func(n) = func(n-1) + func(n-2).
Phase 5: Pointer und Arrays
Phase 5 arbeitet mit einem Array von Zeichen. Die Bombe bildet deine Eingabe auf einen anderen String ab, z.B. durch eine Substitutionstabelle. Disassembliere die Funktion und suche nach einer festen Tabelle (z.B. array.1234). Mit print (char[16])*0xADRESSE kannst du die Tabelle auslesen. Dann musst du eine Eingabe finden, deren transformierte Version einem Zielstring entspricht. Das erinnert an die Funktionsweise von Passwort-Hashing oder Verschlüsselung – ein Thema, das bei aktuellen KI-Sicherheitslücken oft diskutiert wird.
Phase 6: Die Königsdisziplin
Phase 6 ist die schwerste. Sie arbeitet oft mit einer verketteten Liste oder einem Baum. Du musst die Knoten in einer bestimmten Reihenfolge eingeben. Mit GDB kannst du die Knotenstruktur analysieren:
(gdb) print *node1
(gdb) print node1->nextFinde die Bedingung, die die Bombe prüft (z.B. die Werte der Knoten müssen aufsteigend sortiert sein). Dann suche die passende Reihenfolge der Knoten-IDs.
Geheimphase: Die versteckte Herausforderung
Viele Bomben haben eine geheime Phase, die durch eine bestimmte Eingabe in einer früheren Phase aktiviert wird. Achte auf zusätzliche Strings wie "Curses, you've found the secret phase!" in der Disassemblierung. Die geheime Phase erfordert oft das Aufrufen einer secret_phase Funktion – setze einen Breakpoint darauf und analysiere sie wie die anderen Phasen.
Tipps für effizientes Debuggen
- Erstelle eine Textdatei mit den bisherigen Lösungen, um sie nicht jedes Mal neu eingeben zu müssen:
./bomb loesungen.txt - Nutze
layout asmin GDB, um den Assembly-Code live zu sehen. - Verwende
stepianstattnext, um wirklich jede Instruktion zu sehen. - Notiere dir die Explosionsanzahl – du verlierst nur 0,5 Punkte pro Explosion, aber maximal 15 Punkte insgesamt.
Häufige Fehler vermeiden
Vermeide Brute-Force! Das führt zu Punktabzug und kann dich sogar vom Server aussperren. Vertraue auf deine Debugging-Fähigkeiten. Ein weiterer Fehler: Nicht alle Register und Speicherstellen richtig interpretieren. Übe das Lesen von AT&T-Syntax (die Standard-Syntax auf den CS-Rechnern).
Fazit: Debugging als Superkraft
Das Entschärfen der Binary Bomb in CSCI 247 ist mehr als nur eine Aufgabe – es ist eine Einführung in das Reverse Engineering, das in vielen Bereichen der Informatik unverzichtbar ist. Ob du später in der Cybersecurity, bei der Softwareanalyse oder in der KI-Forschung arbeitest: Die Fähigkeit, Code auf Maschinenebene zu verstehen, wird dir helfen, Probleme zu lösen, die andere nicht einmal sehen. Also, schnapp dir deine Bombe und werde zum Bombenentschärfer!