# Lösung: Dateien mit `file` untersuchen (files.zip) Nach dem Auspacken des Archivs kann man durch den Aufruf von `file *` die entsprechenden Dateien analysieren. | Datei | Ausgabe von `file` | Werkzeug | Inhalt | |---|---|---|---| | `a` | PNG image data, 100 x 100, 8-bit gray+alpha, non-interlaced | Bildbetrachter | Rick Astley | | `b` |JPEG image data, ... , 250x157, components 3 | Bildbetrachter | JPG-Bild eines Egg Mac Muffins | | `c` | PE32 executable (DLL) (console) Intel 80386 (stripped to external PDB), for MS Windows | `rabin2` | Shared Library für Windows mit nur zwei Exports: `GetDiskKey` und `GetDiskKey_Version` | | `d` | PE32 executable (GUI) Intel 80386, for MS Windows | `rabin2` | Ausführbare Datei für Windows. Symbole und Strings können mit `rabin2` ausgegeben werden. Ausführen der Datei ist zu riskant. | | `e` | ELF 64-bit LSB shared object, ... , not stripped | `rabin2` | Bibliothek (shared object) für Linux x86, nicht gestrippt | | `f` | ELF 64-bit LSB pie executable, ... , not stripped | `rabin2` | Ausführbares Programm für Linux. Ausführen der Datei ist zu riskant. | | `g` | ELF 64-bit LSB shared object, ... , stripped | `rabin2` | Bibliothek (shared object) für Linux x86, gestrippt | | `h` | ELF 64-bit LSB pie executable, ... , stripped | `rabin2` | Ausführbares Programm für Linux. Ausführen der Datei ist zu riskant. | | `i` | ELF 64-bit LSB relocatable, ... , not stripped | `rabin2` | Objekt-Datei mit der Main-Funktion eines Programms. | | `j` | Compiled Java class data, version 61.0 | `javap` | Java-Klasse mit dem Namen `FlagPrinter`, die nur eine `main`-Methode enthält. | | `k` | ASCII text | `less` | Rick Astley Song | | `l` | data | `hexyl` | Binärdaten: ff ff 00 00 ca fe ba be 00 00 00 | | `m` | Atari ST M68K contiguous executable | `strings` | Teil des Softwarepaketes Degas | | `n` | gzip compressed data, was "n" ... | `gzip`, `less` | Komprimierte Version von k | ## zu `e`, `f`, `g`, `h` Betrachtet man die Build-IDs, die von `file` ausgegeben werden sieht man: ```console e: ELF ... BuildID[sha1]=82d337f3906e7639b404001a5c501e9308848c80 f: ELF ... BuildID[sha1]=94fbda07657d2a358c1844e7682632621affde92 g: ELF ... BuildID[sha1]=82d337f3906e7639b404001a5c501e9308848c80 h: ELF ... BuildID[sha1]=94fbda07657d2a358c1844e7682632621affde92 ``` `e` + `g` und `f` + `h` haben jeweils dieselben Build-IDs. Dies deutet darauf hin, dass es auch dieselben Programme bzw. Bibliotheken sind -- nur einmal jeweils gestrippt. ## Zu `j` `javap` braucht den Namen der Java-Klasse, um sie zu laden und auszugeben. Den Namen kann leicht mit dem `strings`-Kommando finden, weil der Namen der Quelldatei ebenfalls in der Klasse gespeichert ist. ```console $ strings j ... SourceFile FlagPrinter.java ... ``` Damit kann man die Datei umbenennen und `javap` verwenden: ```console $ cp j FlagPrinter.class $ javap -cp . FlagPrinter Compiled from "FlagPrinter.java" public class FlagPrinter { public FlagPrinter(); public static void main(java.lang.String[]) throws java.lang.Exception; static {}; } ``` ## zu `l` Der Inhalt der Datei kann einfach mit einem Hexeditor, z.B. `hexyl` oder `hexedit` angesehen werden: ```console $ hexyl l ┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐ │00000000│ ff ff 00 00 ca fe ba be ┊ 00 00 00 │××00××××┊000 │ └────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘ ``` ## zu `m` Da es sich um ein sehr altes Format handelt (1980er Jahre), kommen die normalen Werkzeuge damit nicht klar. Man kann allerdings zumindest die enthaltenen Strings ausgeben lassen. ```console $ strings -n 10 ... D:\DEGASART\ART1.SCPD:\DEGASART\PICS\D:\DEGASART\DEGASART.RSCTITLE.PC1 ... ``` ## zu `n` Nach dem Auspacken sieht man, dass `n` nur eine komprimierte Version von `k` ist.