
In diesem Artikel erfahren Sie, wie Sie ELF-Dateien in Cutter am Beispiel leichter Aufgaben dekompilieren. Frühere Einführung in Reverse
Parts : Teil 1: C-, C ++ - und DotNet-Dekompilierung - Reverse Basics
Teil 2: MIPS Reverse und Golang - Reverse Basics
Organisationsinformationen
Speziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit entwickeln möchten, werde ich über die folgenden Kategorien schreiben und sprechen:
, , , .
, , Telegram . , , .
. , - , .
- PWN;
- Kryptographie (Krypto);
- Netzwerktechnologien (Netzwerk);
- (Reverse Engineering);
- (Stegano);
- WEB-.
, , , .
, , Telegram . , , .
. , - , .
Gefälschte Anweisungen
Dies ist die achte Aufgabe in dieser Kategorie, und wir werden über das Vorhandensein gefälschter Anweisungen informiert. Schauen wir uns zunächst die Dateiinformationen an.
Ich öffne das Programm in Cutter - einer GUI für radare2 mit einem eingebauten Ghidra-Dekompiler, der emulieren und in jüngerer Zeit debuggen kann. Und sofort bekommen wir eine interessante Liste von Funktionen.
Fahren wir mit der Hauptfunktion fort und dekompilieren sie.
Ganz am Anfang wird der Kanarienvogel initialisiert und die Anzahl der Argumente überprüft. Danach werden 0x1f Bytes zugewiesen, wobei die angegebene konstante Zeichenfolge kopiert wird, die Adresse in der Variablen iVar3 gespeichert wird und dann einzelne Bytes dieser Zeichenfolge geändert werden. Als nächstes finden Transformationen mit dem String s1 statt, der für uns nicht von Interesse ist. Die WPA-Funktion wird ebenfalls initialisiert, und das von uns eingegebene Kennwort wird in die auStack50-Adresse geschrieben und zusammen mit der konvertierten iVar3-Zeichenfolge an die WPA-Funktion übergeben. Anschließend wird der kanarische Wert überprüft und das Programm beendet.
Fahren wir mit der WPA-Funktion fort.
Die zuvor in das Programm eingefügte Zeile wird erneut geändert, wonach die beiden Zeilen verglichen werden. Wenn sie gleich sind, wird die Funktion blowfish () aufgerufen, die uns das richtige Passwort für die Änderung anzeigt, andernfalls wird die Funktion RS4 () aufgerufen.
Da die zuvor eingegebenen Werte entschlüsselt werden, können wir das Programm debuggen und das Vergleichsergebnis ändern. Gehen wir zu dem Ort, an dem die Zeichenfolgen verglichen werden, und legen einen Haltepunkt fest.
Beginnen wir nun mit dem Debuggen - F9 und geben die Programmargumente ein.
Klicken Sie auf die Schaltfläche weiter in der Navigationsleiste, bis wir unseren Haltepunkt erreichen. Das Ergebnis des Vergleichs von Zeichenfolgen mit der Funktion strcmp () wird in das EAX-Register geschrieben, das dann überprüft wird. Da die Zeichenfolgen nicht gleich sind, enthält dieses Register den Wert 1.
Lassen Sie es uns auf 0 ändern, um den Zweig des Programmverhaltens zu ändern und die Ausführung fortzusetzen. Nach Abschluss in der Cutter-Konsole sehen wir die richtige Antwort, die auf der Site eingereicht werden sollte.
Ptrace
Laden Sie das Programm herunter und überprüfen Sie es.
Nichts Besonderes, Sie müssen ein Passwort finden. Es gibt jedoch einen kleinen Schutz gegen Debugging (ptrace) und Übergänge, die manuell bearbeitet werden müssen. So zeigt das Diagramm in IDA Pro.
Wir werden diese Aufgabe auch in Cutter erledigen, es werden automatisch alle Übergänge korrigiert.
Fahren wir mit der Dekompilierung der Hauptfunktion fort.
Und das richtige Passwort sind die entsprechenden 4 Buchstaben aus der am Anfang angegebenen Zeichenfolge.
ARM ELF
Dies ist eine Binärdatei für die ARM-Architektur. Wir werfen sie in Cutter und wählen die Hauptfunktion aus. Aus dem Funktionsgraphen sehen wir, womit wir es zu tun haben, und höchstwahrscheinlich handelt es sich um einen zeichenweisen Vergleich.
Wir öffnen den Dekompiler und analysieren das Programm.
Zunächst wird das Vorhandensein des Programmarguments und seine Länge überprüft, es muss gleich 6 sein.
Die Variable var_14h fungiert also als Index und nimmt den Wert 0 an. Dann finden eine Reihe von Vergleichen statt, die wir als Bedingungen betrachten werden:
str [0] == str [5]
str [0] + 1 == str [1]
str [3] + 1 == str [0]
str [2] + 4 == str [5]
str [4] + 2 == str [2]
0 == str [3] ^ 0x72
Implementieren wir den Algorithmus und erhalten das Passwort.
Und wir bekommen das gewünschte Passwort. Das ist alles für jetzt.
Sie können sich uns unter anschließenTelegramm . Dort finden Sie interessante Materialien, durchgesickerte Kurse und Software. Lassen Sie uns eine Community zusammenstellen, in der es Menschen geben wird, die sich in vielen Bereichen der IT auskennen. Dann können wir uns in Fragen der IT und der Informationssicherheit immer gegenseitig helfen.