assignments/Assignment_002/solution/readme.md

85 lines
4.1 KiB
Markdown
Raw Normal View History

2024-10-02 15:11:46 +02:00
# 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.