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

0
533
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):

  • linux-vdso.also: Virtual Dynamic Shared Object (VDSO) ist ein kernel-Mechanismus, der es erlaubt ein set von kernel-space-Routinen für den Zugriff durch ein user-space binäre. Dies vermeidet den Aufwand für einen Kontextwechsel aus user-kernel-Modus. VDSO gemeinsam genutzte Objekte halten Sie die Ausführbare und Verknüpfbar Format (ELF) – format, so dass Sie dynamisch mit den binären während der Laufzeit. Die VDSO dynamisch zugeordnet und nutzt ASMR. Die VDSO-Fähigkeit wird durch den standard-GNU-C-Bibliothek, wenn der kernel unterstützt die ASMR-Schema.
  • libc.so.6: Der GNU-C-Bibliothek gemeinsam genutzte Objekt.
  • /lib64/ld-linux-x86-64.so.2: Dies ist der dynamische linker die binäre verwenden will. Der dynamische linker hinterfragt die binäre entdecken, welche Abhängigkeiten es hat. Es startet die freigegebenen Objekte in den Speicher. Es bereitet die Binärdatei ausführen und in der Lage zu finden und Zugriff auf die Abhängigkeiten in den Speicher. Dann startet es das Programm.

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:

  • Klasse: Gibt an, ob die binary ist ein 32 – oder 64-bit-executable (1=32, 2=64).
  • Daten: Zeigt die endianness im Einsatz. Endian-Codierung definiert die Art und Weise, die mehr-Byte-zahlen gespeichert sind. In big-endian-Codierung, eine Nummer gespeichert ist, mit seinen höchstwertigen bits zuerst. In little-endian-Codierung, die Anzahl gespeichert ist, mit seiner am wenigsten signifikanten bit zuerst.
  • Version: Die version der ELF (momentan 1).
  • OS/ABI: Stellt die Art des application binary interface im Einsatz. Dieser definiert die Schnittstelle zwischen zwei Binär-Module, wie ein Programm und eine gemeinsame Bibliothek.
  • ABI-Version: Die version des ABI.
  • Typ: Der Typ des ELF-Binärformat. Die gemeinsamen Werte sind ET_REL für ein verschiebbarer Ressource (z.B. ein Objekt-Datei), ET_EXEC für eine ausführbare Datei kompiliert mit der -keine-Torten-Flagge und ET_DYN für ein ASMR-fähigen ausführbare Datei.
  • Maschine: Die Befehlssatz-Architektur. Dies zeigt die Zielplattform, für die die binary erstellt wurde.
  • Version: Immer auf 1 gesetzt, für diese version der ELBEN.
  • Entry Point Address: Speicher-Adresse innerhalb des binären bei dem die Ausführung beginnt.

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

  • › Microsoft Wird die Merge-UWP-und Win32-Anwendungen Mit dem Projekt Reunion
  • › Windows 10 Ist das Erste Grafische Linux-Anwendungen Mit GPU-Unterstützung
  • › Windows 10 ist PowerToys Erhalten einen Launcher und Keyboard Remapper
  • › Microsoft Rand Ist Immer eine Web-Suche Seitenleiste
  • › Die Neue Windows-Terminal-Fertig Ist; Hier ist der Grund, Warum Es ist Erstaunlich,