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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Radare2 | ein Werkzeug, das Programme analysiert und anzeigt | r2 |
| Analyse | der Schritt, in dem radare2 Funktionen und Texte benennt | aa |
| Verzweigung | eine Stelle, an der das Programm zwischen zwei Wegen wählt | |
| Sprungziel | die Adresse, zu der ein Sprung führt | |
| Kontrollfluss | die Wege, die ein Programm durch seine Befehle nehmen kann | |
| strcmp | eine 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
mkdir -p ~/uebungHier 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
cd ~/uebungHier 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
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.cHier 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
gcc -O0 -no-pie -fno-stack-protector -o pforte pforte.cHier 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
rm pforte.cHier 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
r2 -q -e scr.color=0 -c aa -c 'pdf @ main' pforte 2>/dev/nullHier 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
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
| Zeile | Was sie bedeutet |
|---|---|
| cmp dword [var_4h], 2 | Sind es genau zwei Argumente? |
| je 0x… | Ja: weiter zur Prüfung der Rolle |
| call sym.imp.strcmp | Vergleicht den Text mit einem festen Text |
| test eax, eax | War 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.