Ich hatte vor kurzem die Aufgabe, ein binäres Linux-Programm zu verstehen. Das Programm war jedoch in binärer Form.
Ich habe die Befehle file
, strings
und objdump
eine Ahnung davon zu haben , was es tat, und welche Funktionen sie rief.
Es scheint, dass die Binärdatei mit Debugging-Informationen kompiliert ist. Was kann ich noch darüber lernen?
linux
reverse-engineering
Jeff Schaller
quelle
quelle
Antworten:
Unter Einbeziehung der Befehle, die Sie bereits verwendet haben, werde ich mein Bestes geben, um zu beschreiben, wie einige forensische Operationen in einer ausführbaren Datei ausgeführt werden können.
Der bescheidene
strings
Befehl kann nützlich sein, um Textfehlermeldungen zu visualisieren, die Hinweise auf die binären Funktionen geben. Es ist auch eine einfache Möglichkeit , gepackte Binärdateien wie im Beispiel zu erkennen (häufig bei Malware-Binärdateien):file
ermöglicht es, die ausführbaren Eigenschaften zu sehen, nämlich:In diesem Beispiel bedeutet "nicht entfernt", dass es mit Debugging-Informationen kompiliert wurde.
objdump
erstellt die Disassembly-Liste einer ausführbaren Datei:objdump
Lässt auch zu, welcher Compiler zum Kompilieren der ausführbaren Binärdatei verwendet wird:objdump
listet auch externe Funktionen auf, die dynamisch zur Laufzeit verknüpft sind:$ objdump -T exe_file
Sie können die Binärdatei in einer VM ausführen, die nur zum Ausführen der Binärdatei erstellt und dann verworfen wurde. Verwenden Sie
strace
,ltrace
,gdb
undsysdig
mehr darüber zu erfahren , was die binäre am System tut Level während der Laufzeit aufruft.Es kann auch Schritt für Schritt mit debuggt werden
gdb
.Verwenden Sie sysdig wie in:
Wir werden uns im weiteren Verlauf dieser Antwort erneut mit der statischen Analyse der Binärdatei selbst befassen.
ldd exe_file
listet die verwendeten Bibliotheken auf;size -A exe_file
readelf -x .rodata exe_file
Listet statische Zeichenfolgen aufreadelf -h exe_file
Ruft ELF-Header-Informationen abreadelf -s exe_file
zeigt Symbole annm exe_file
listet Symbole aus der Objekttabelle auf:Neben dem Zerlegen der Binärdatei mit
objdump
kann auch ein Dekompiler verwendet werden.Für das Dekompilieren habe ich kürzlich eine technische Herausforderung durchgeführt, bei der ich zwei kleine 64-Bit-Linux-Binärdateien dekompilieren musste.
Ich habe versucht, Bumerang und Schneemann zu benutzen. Das Boomerang-Projekt scheint aufgegeben zu sein, und ich war von den Einschränkungen beider nicht beeindruckt. Einige andere Alternativen, entweder Open Source / Freeware / Alt, einschließlich einer kürzlich von Avast veröffentlichten, dekompilierten nur 32-Bit-Binärdateien.
Am Ende habe ich die Demo von Hopper unter MacOS ausprobiert (es gibt auch eine Linux-Version).
Hopper zerlegt und dekompiliert entweder 32- oder 64-Bit-Binärdateien für OS / X, Linux und Windows. Es ist in der Lage, große Binärdateien zu bearbeiten, wenn es lizenziert ist.
Es erstellt auch Flussdiagramme der Funktionen von / Programmstruktur und Variablen.
Es wird auch aktiv gewartet und aktualisiert. Es ist jedoch kommerziell.
Ich habe es sehr genossen, es und die daraus resultierende Ausgabe zu benutzen, die eine Lizenz gekauft hat. Die Lizenz ist weitaus günstiger als Hex-Strahlen.
In den Kommentaren zu dieser Antwort erwähnen @d33tah und @Josh auch als Open-Source-Alternativen radare2 und die entsprechende grafische Benutzeroberfläche Cutter , die Hopper in Linux ähnelt, kann nicht persönlich dafür bürgen, da ich sie nicht benutze.
Da die Zielbinärdatei mit Debug-Informationen kompiliert wurde, erhalten Sie möglicherweise auch den ursprünglichen Namen der Funktionen und Variablen zurück.
Insbesondere werden Sie die Kommentare im Quellcode niemals zurückerhalten, da sie in keiner Weise in ausführbare Binärdateien kompiliert werden.
Das Verbessern der Qualität der Ausgabequelle und das Verstehen der Binärdatei erfordern immer etwas Zeit und Detektivarbeit. Decompiler erledigen nur einen Großteil der Arbeit.
Beispiel für eine Hopper-Ausgabe ohne Debug-Informationen:
Die grafische Oberfläche von Hopper ist ebenfalls sehr benutzerfreundlich (mehrere Funktionen gleichzeitig auf diesem Bild erweitert):
siehe auch die verwandte Frage Warum sind wahr und falsch so groß?
quelle
strace -f
, untergeordnete Threads / Prozesse zu verfolgen. Es gibt Optionen , die Ausgabe in separate Dateien für jede PID zu spalten, oder Sie können einfach/12345
inless
suchen und markieren Linien , die mit der PID beginnen Sie interessiert sind. Wenn die Dinge nicht zu durcheinander (zB Shell - Skript starten andere Prozesse, nicht gleichzeitige Threads), kann dies verwendet werden. Aber ja, es ist äußerst hilfreich, nur zu sehen, welche Konfigurations- / anderen Dateien eine verwirrende Software zu lesen versucht, wenn Sie herausfinden wollen, warum sie mit der Art und Weise, wie Sie sie installiert haben, nicht zufrieden sind.radare2
die Liste hinzufügen .