AllInfo

Wie Blick in Binären Dateien Aus der Linux-Kommandozeile

fatmawati achmad zaenuri/Shutterstock

Ein mystery-Datei? Die Linux-file-Kommando wird schnell sagen, um welche Art Datei es ist. Wenn es eine Binär-Datei, obwohl, können Sie herausfinden, noch mehr über Sie. die Datei hat eine ganze Reihe von Stallkollegen, die Ihnen helfen, es zu analysieren. Wir zeigen dir, wie du einige dieser tools.

Identifizieren Von Dateitypen

Dateien haben in der Regel Eigenschaften, die es ermöglichen, software-Pakete, um zu ermitteln, welche Art von Datei es sich handelt, als auch, was in den Daten, die Sie darstellt. Würde es nicht Sinn machen, zu versuchen Sie zum öffnen einer PNG-Datei in eine MP3-Musik-player, so dass es praktisch und pragmatisch, dass eine Datei in sich trägt, irgendeine form von ID.

Das kann ein paar bytes am Anfang der Datei. Dies ermöglicht es, eine Datei explizit über deren format und Inhalt. Manchmal, die Datei-Typ ist abgeleitet von einem unverwechselbaren Aspekt der internen Organisation der Daten selbst, bekannt als der-Datei-Architektur.

Einige Betriebssysteme, wie Windows, sind vollständig geführt von einer Datei-Erweiterung. Sie können es nennen, leichtgläubig oder Gutgläubig, aber Windows meint eine Datei mit dem DOCX-Erweiterung ist wirklich eine DOCX-word-Datei Verarbeitung. Linux ist nicht so, dass, wie Sie bald sehen werden. Es will den Beweis und sucht innerhalb der Datei zu finden.

Die tools die hier beschrieben wurden, bereits installierte Manjaro 20, Fedora 21 und Ubuntu 20.04-Distributionen, die wir verwendet, um Forschung in diesem Artikel. Wir beginnen unsere Untersuchung, indem Sie die Datei-Befehl.

Mit dem file-Befehl

Wir haben eine Sammlung von verschiedenen Datei-Typen in unserem aktuellen Verzeichnis. Sie sind eine Mischung von Dokument, Quellcode, ausführbare Datei und text-Dateien.

Der Befehl ls zeigt uns, was im Verzeichnis ist, und die -hl (human-readable-Größen, lange Liste) – option zeigen Sie uns die Größe der einzelnen Dateien:

ls -hl

Lassen Sie uns versuchen, die Datei auf ein paar von diesen und sehen, was wir bekommen:

Datei build_instructions.odt
Datei build_instructions.pdf
Datei COBOL_Report_Apr60.djvu

Die drei Datei-Formate werden korrekt erkannt. Wo es möglich ist, die Datei gibt uns ein bisschen mehr Informationen. Die PDF-Datei wird berichtet, dass in der version 1.5-format.

Auch wenn wir benennen Sie die ODT-Datei eine Erweiterung haben mit der willkürlichen Wert von XYZ, die Datei ist immer noch korrekt identifiziert werden, sowohl innerhalb der Dateien, Datei-browser oder auf der Kommandozeile mittels-Datei.

Innerhalb der Dateien, Datei-browser, es ist das richtige Symbol. Auf der Kommandozeile, Datei ignoriert die Erweiterung und sucht innerhalb der Datei bestimmen Sie deren Typ:

Datei build_instructions.xyz

Mithilfe-Datei auf Medien, wie Bild und Musik-Dateien, in der Regel liefert Informationen über deren format, Codierung, Auflösung, und so weiter:

Datei screenshot.png
Datei screenshot.jpg
Datei Pachelbel_Canon_In_D.mp3

Interessant, auch mit plain-text-Dateien, Datei nicht beurteilen, die Datei durch die Erweiterung. Zum Beispiel, wenn Sie eine Datei mit der “.c” – Erweiterung, mit standard-nur-text, aber nicht source-code-Datei nicht Fehler für eine echte C-Quellcode-Datei:

Datei Funktion+Header.h
die Datei makefile
die Datei Hallo.c

Datei korrekt identifiziert die header-Datei (“.h”) als Teil einer C-source-code-Kollektion von Dateien, und Sie weiß, dass das makefile ist ein Skript.

Mithilfe der Datei mit dem Binär-Dateien

Binäre Dateien sind eher eine “black box” als andere. Bild-Dateien können betrachtet, sound-Dateien können wiedergegeben werden, und Dokument-Dateien können geöffnet werden, indem das entsprechende software-Paket. Binäre Dateien sind, sind jedoch eine größere Herausforderung.

Zum Beispiel die Dateien “Hallo” und “wd” sind ausführbare Binärdateien. Sie sind Programme. Die Datei namens “wd.o” ist eine Objekt-Datei. Wenn source-code kompiliert wird durch einen compiler, einen oder mehrere Objekt-Dateien erstellt werden. Diese enthalten den Maschinencode der computer wird schließlich ausgeführt werden, wenn das fertige Programm läuft, zusammen mit Informationen für den linker. Der linker überprüft jede Objekt-Datei für die Funktion Aufrufe Bibliotheken. Es verbindet alle Bibliotheken, die das Programm verwendet. Das Ergebnis dieses Prozesses ist eine ausführbare Datei.

Die Datei “watch.exe” ist eine binäre ausführbare Datei, die wurde cross-kompiliert werden, um auf Windows laufen:

Datei wd
Datei wd.o
Datei Hallo
Datei watch.exe

Wobei der Letzte zuerst, die Datei sagt uns, die “watch.exe” Datei ist eine PE32+ ausführbare Datei, Konsole-Programm für die x86-Familie von Prozessoren, die auf Microsoft Windows. PE steht für portable executable-format, die 32 – und 64-bit-Versionen. Die PE32 ist die 32-bit-version, und die PE32+ wird die 64-bit-version.

Die anderen drei Dateien sind alle identifiziert, die als Ausführbare und Verknüpfbar Format (ELF) Dateien. Dies ist ein standard für ausführbare Dateien und shared-object-Dateien, wie zum Beispiel Bibliotheken. Werfen wir einen Blick auf die ELF-header-format in Kürze.

Was könnte Ihre Aufmerksamkeit erregen, ist, dass die zwei ausführbaren Dateien (“wd” und “hello”) identifiziert werden, wie die Linux Standard Base (LSB), gemeinsame Objekte und der Objekt-Datei “wd.o” identifiziert wird, als ein LSB relocatable. Das Wort ausführbar ist offensichtlich in seiner Abwesenheit.

Objekt-Dateien sind versetzbar, d.h. der code in Ihnen können in den Arbeitsspeicher geladen werden an jedem Standort. Die ausführbaren Dateien, die aufgelistet werden, wie gemeinsam genutzte Objekte, weil Sie erstellt wurden, haben die vom linker aus den Objekt-Dateien in einer Weise, dass Sie Erben diese Fähigkeit.

Dies ermöglicht es der Address Space Layout Randomization (ASMR) system zum laden der ausführbaren Dateien in den Speicher-Adressen Ihrer Wahl. Standard-executables haben ein laden-Adresse codiert, die in Ihrem Header, die diktieren, wo Sie in den Speicher geladen.

ASMR ist ein Sicherheits-Technik. Laden von ausführbaren Dateien in den Speicher zu vorhersagbaren Adressen macht Sie anfällig für Angriff. Dies ist, weil Ihre Einstiegspunkte, und die Positionen Ihrer Funktionen, wird immer bekannt sein, um Angreifer. Position Independent Executables (PIE), positioniert an einer zufälligen Adresse überwindung dieser Anfälligkeit.

Wenn wir kompilieren unser Programm mit dem gcc-compiler und bieten die -nicht-pie-option, wir erstellen einen herkömmlichen ausführbaren Datei.

Die Option-o (output file) die option ermöglicht uns einen Namen für unsere ausführbar:

gcc -o Hallo -Nein-Kuchen Hallo.c

Wir verwenden die Datei auf die neue ausführbare Datei und sehen, was sich geändert hat:

Datei Hallo

Die Größe der ausführbaren Datei ist der gleiche wie vorher (17 KB):

ls -hl-Hallo

Das binary ist jetzt identifiziert als standard ausführbar. Wir tun dies nur zu Demonstrationszwecken. Wenn Sie kompilieren von Anwendungen auf diese Weise, Sie verlieren alle Vorteile der ASMR.

Warum Ist eine Ausführbare Datei So Groß?

Unser Beispiel hello-Programm 17 KB, so könnte es kaum als groß, aber dann ist alles relativ. Der source-code ist 120 bytes:

Katze Hallo.c

Was ist Füllstoff aus der binäre wenn alle es tut, ist print ein string in das terminal-Fenster? Wir wissen, es gibt einen ELF-header, aber das ist nur 64 Byte lang sein, um eine 64-bit-binary. Klar, es muss etwas anderes sein:

ls -hl-Hallo

Let ‘ s Scannen Sie den binären mit dem strings-Befehl als eine einfache erste Schritt, um zu entdecken, was in ihm steckt. Wir werden pipe in less:

strings hello | weniger

Es gibt viele Zeichenfolgen, die in die binären, neben dem “Hallo, Geek-Welt!” aus unserem source code. Die meisten von Ihnen sind Bezeichnungen für Regionen innerhalb der binäre, und die Namen und die Verknüpfung von Informationen von shared objects. Dazu zählen die Bibliotheken und Funktionen in den Bibliotheken, auf die der binären hängt.

Der ldd-Befehl zeigt uns die shared-object-Abhängigkeiten binäre:

ldd hello

Es gibt drei Einträge in der Ausgabe, und zwei von Ihnen verfügen über einen Verzeichnis-Pfad (die erste nicht):

Der ELF-Header

Wir können untersuchen und entschlüsseln der ELF-header mit dem Dienstprogramm readelf-und -h (header-Datei) option:

readelf -h Hallo,

Der header wird interpretiert für uns.

Das erste byte aller ELF-Binärdateien festgelegt ist hexadezimalen Wert 0x7F. Die nächsten drei bytes gesetzt sind, 0x45, 0x4C, und 0x46. Das erste byte ist ein flag, das kennzeichnet die Datei als ELF-Binärdatei. Um diese Kristall-klar, die nächsten drei bytes buchstabieren “ELF” in ASCII:

Die anderen Einträge sind die Größen und Anzahlen von Regionen und Bereiche innerhalb der binären also Ihre Standorte berechnet werden kann.

Einen kurzen Blick auf die ersten acht bytes der Binärdatei mit hexdump zeigt das Signatur-byte und “ELF” – string in den ersten vier bytes der Datei. Die -C (kanonische) option gibt uns die ASCII-Darstellung der bytes, die neben Ihren hexadezimal-Werte und den-n – (Anzahl) option können Sie uns angeben, wie viele bytes wir sehen wollen:

hexdump -C -n 8 Hallo

objdump und die Granulare Sicht

Wenn Sie sehen möchten der nitty-gritty Details, die Sie verwenden können, die objdumpcommand mit der -d (zerlegen) option:

objdump -d hello | weniger

Dieser zerlegt Sie die ausführbaren Maschinen-code und zeigt ihn im hexadezimal-bytes neben der Assembler-Sprache-äquivalent. Die Adresse Lage der ersten bye in jeder Zeile wird angezeigt, auf der linken Seite.

Dies ist nur sinnvoll, wenn Sie Lesen können, assembly language, oder du bist neugierig, was hinter dem Vorhang. Es gibt eine Menge von Ausgabe -, so werden wir geleitet, es in weniger.

Kompilieren und Verknüpfen

Es gibt viele Möglichkeiten, um kompilieren Sie eine binary. Zum Beispiel, der Entwickler entscheidet, ob debugging-Informationen. Die Art und Weise der binäre verknüpft ist, spielt auch eine Rolle in Ihrem Inhalt und Größe. Wenn die binäre Referenzen teilen die Objekte als externe Abhängigkeiten, wird es kleiner als eins, zu dem die Abhängigkeiten statisch verknüpft werden.

Die meisten Entwickler, die bereits wissen, die Befehle haben wir hier behandelt. Für andere, obwohl Sie bieten einige einfache Möglichkeiten, um zu stöbern und zu sehen, was liegt im inneren des binary black-box.

LESEN SIE WEITER

Exit mobile version