Ich möchte einen kurzen Blogpost darüber loswerden, wie man unter Linux Programme untersucht. Dazu möchte ich die Tools “strings”, “ltrace”, “strace” und “ldd” vorstellen.
strings
Das Tool “strings” gibt es im Paket “binutils”, welches soweit vorinstalliert sein sollte. Mit diesem Tool kann man sich alle Zeichenketten einer Datei ausgeben lassen. Das kann nützlich sein, wenn man in einer Binary nach Zeichenketten sucht, z.B. C&C-Server eines Trojaners.
strings /usr/bin/ls
Möchte man sich noch die Offsets der Strings anzeigen lassen, so kann man die Option “-t” nutzen. Diese unterscheidet zwischen drei Ausgabeformaten: o für octal, x für hexadecimal, d für decimal.
strings -t x /etc/passwd
strace & ltrace
Möchte ein Programm nicht das machen was es soll oder hängt es sich, ohne Ausgabe auf dem stderr Kanal, auf, dann kann man strace bzw. ltrace nutzen, um ggf. die Ursache herauszufinden. Dabei führen diese Tools das übergeben Programm aus und protokollieren die entsprechenden Aufrufe.
Die beiden Tools kann man in den gleichnamigen Paketen nachinstallieren:
sudo apt-get install ltrace strace
strace
Strace protokolliert alle Systemaufrufe des ausgeführten Programms. Man erkennt dann z.B. welche Dateien ausgeführt, geöffnet, geschlossen usw. werden und welche Rückgabewerte erzeugt werden.
Sieht man z.B. bei einem “open” einen negativen Rückgabewert (-1), und das Programm bricht daraufhin ab, kann das darauf hindeuten, dass die im Aufruf angegeben Datei nicht gefunden werden konnte.
Hier ein Strace von “mkdir testing”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Man kann sich auch eine kurze Statistik zu den ausgeführten Systemaufrufen anzeigen lassen. Dazu ruft man strace mit der Option “-c” auf.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
ltrace
Im Gegensatz zu strace protokolliert ltrace nur die Aufrufe von externen Bibliotheken (librarys).
Beispiel mit rm -r testing:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
|
In der Ausgabe sieht man die Librarycalls und deren Rückgabewerte. Das kann ebenfalls für Debugging-/Analysezwecke hilfreich sein.
Nützlich kann auch die Fähigkeit, an laufende Prozesse anzudocken, sein. Dazu muss man die Option “-p” gefolgt von einer ProzessID aufrufen:
ltrace -p $(pgrep vlc)
Mit “pgrep” kann man sich die ProzessID eines Prozesses mit dem als Parameter übergebenen Namen zurückgeben lassen.
Ldd
Auf den Hinweis von @robertmarquardt möchte ich den Artikel um das Programm “ldd” erweitern.
Mit dem Programm kann man sich die die Abhängigkeit eines Programms von externen Bibliotheken anzeigen.
Beispiel:
1 2 3 4 5 6 7 8 9 10 |
|
Falls eine benötigte Bibliothek fehlt, dann kann man diese so ausfindig machen.
Danke hier nochmal für den Hinweis.
Fazit
Falls mal ein Programm nicht so will, wie es soll, bieten strace & ltrace erste Anlaufstellen, um nach der Ursache des Problems zu suchen.
Gruß
gehaxelt