Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Mit radare2 Entscheidungen im Programm finden

Nach dieser Lektion: Ich kann mit radare2 die Stelle finden, an der ein Programm eine Entscheidung trifft.

Lektion, 60 Min.7 BefehleReverse-Engineering-Lab: Programme mit gdb, radare2, strace und ltrace in einer VM lesen

Wo entscheidet ein Programm?

Radare2, kurz r2, ist ein freies Werkzeug, das ein Programm analysiert und seine Funktionen als lesbaren Assembler zeigt. Damit finden Sie die Stelle, an der ein Programm zwischen „erlaubt“ und „verweigert“ wählt.

Diese Stelle ist fast immer ein Vergleich mit einem Sprung dahinter. Wer sie gefunden hat, kennt die Regel des Programms.

Am Ende dieser Lektion

Notiz

Ich kann mit radare2 die Stelle finden, an der ein Programm eine Entscheidung trifft.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Radare2ein Werkzeug, das Programme analysiert und anzeigtr2
Analyseder Schritt, in dem radare2 Funktionen und Texte benenntaa
Verzweigungeine Stelle, an der das Programm zwischen zwei Wegen wählt
Sprungzieldie Adresse, zu der ein Sprung führt
Kontrollflussdie Wege, die ein Programm durch seine Befehle nehmen kann
strcmpeine Funktion, die zwei Texte vergleicht und bei Gleichheit 0 liefert

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Programm mit zwei Ausgängen

Das Programm pforte sollen Sie gleich bauen. Es erwartet ein Wort auf der Kommandozeile, eine Rolle. Kennt es die Rolle, sagt es „Zutritt zum Lager“, sonst „Zutritt verweigert“.

Welches Wort es kennt, steht nirgends in dieser Lektion. Sie lesen es gleich selbst aus dem Programm.

Den Übungsordner anlegen, falls er fehlt

Befehl
mkdir -p ~/uebung

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Übungsordner wechseln

Befehl
cd ~/uebung

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Quelltext von pforte schreiben

Befehl
printf '%s\n' '#include <stdio.h>' '#include <string.h>' 'int main(int argc, char **argv) {' '    if (argc != 2) {' '        puts("Aufruf: pforte ROLLE");' '        return 2;' '    }' '    if (strcmp(argv[1], "personal") == 0) {' '        puts("Zutritt zum Lager.");' '        return 0;' '    }' '    puts("Zutritt verweigert.");' '    return 1;' '}' > pforte.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Programm bauen

Befehl
gcc -O0 -no-pie -fno-stack-protector -o pforte pforte.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Quelltext löschen

Befehl
rm pforte.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

So fragen Sie radare2 nach main

Der Aufruf hat vier Teile. -q beendet r2 nach den Befehlen. -e scr.color=0 schaltet die Farben aus. -c aa startet die Analyse, und -c "pdf @ main" druckt die Befehle der Funktion main.

Das Ergebnis ist lang. Lesen Sie es von oben nach unten und halten Sie nach cmp, test und Sprüngen Ausschau.

Die Funktion main in radare2 ansehen

Befehl
r2 -q -e scr.color=0 -c aa -c 'pdf @ main' pforte 2>/dev/null

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Nur Vergleiche und Sprünge behalten

Befehl
r2 -q -e scr.color=0 -c aa -c 'pdf @ main' pforte 2>/dev/null | grep -E 'cmp|test|jne|je '

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: die fünf Zeilen, die entscheiden

ZeileWas sie bedeutet
cmp dword [var_4h], 2Sind es genau zwei Argumente?
je 0x…Ja: weiter zur Prüfung der Rolle
call sym.imp.strcmpVergleicht den Text mit einem festen Text
test eax, eaxWar das Ergebnis 0?
jne 0x…Nein: springt zum Weg „verweigert“

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

strcmp liefert 0, wenn beide Texte gleich sind

Die Funktion strcmp gibt 0 zurück, wenn zwei Texte gleich sind, sonst eine andere Zahl. Der Befehl test eax, eax prüft, ob eax gleich 0 ist.

Direkt davor lädt das Programm mit lea die Adresse des festen Texts. Radare2 schreibt den Text als Kommentar daneben. Genau dort finden Sie, womit verglichen wird.

Ein häufiger Fehler

Warnung

Viele lesen jne als „verweigert“. Ein Sprung bedeutet nichts für sich. Er hängt davon ab, was davor geprüft wurde. Weil strcmp bei Gleichheit 0 liefert, springt jne bei Ungleichheit. Lesen Sie immer zuerst den Vergleich, dann den Sprung.

Weiterführend

Lesen Sie jetzt die Ausgabe von pdf @ main Zeile für Zeile. Welches Wort erwartet pforte? Probieren Sie es mit ./pforte und dem Wort aus.

Zählen Sie dann die Verzweigungen in main. Es sind genau zwei. Die Programme des Labs lesen Sie später selbst auf dieselbe Weise, mit Ihren eigenen Worten im Bericht.

Über dieses Lab und seinen Quellcode: Reverse-Engineering-Lab: Programme mit gdb, radare2, strace und ltrace in einer VM lesen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.