assignments/Assignment_002/solution/readme.md

85 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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.