Mir ist dabei etwas aufgefallen find /bin -exec file {} \;
:
Der file
Befehl meldet einige Einträge in /bin
sind shared objects
, während andere als executables
. Zum Beispiel,
/ bin / ntfsck: Gemeinsam genutztes
ELF-64-Bit-LSB- Objekt , x86-64, Version 1 (SYSV),
dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, entfernt
Gleicher Bericht für gawk
/ usr / bin / gawk: Gemeinsam genutztes
ELF-64-Bit-LSB- Objekt , x86-64, Version 1 (SYSV),
dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.24,
BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, entfernt
Im Gegensatz dazu ist file
für /bin/echo
:
/ bin / echo:
ELF 64-Bit - LSB ausführbar , x86-64, Version 1 (SYSV),
dynamisch gelinkt (verwendet Shared Libs), für GNU / Linux 2.6.24,
BuildID [SHA1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, gestrippt
Im Wesentlichen möchte ich wissen, was der Unterschied zwischen executable
Dateien und shared object
Dateien ist.
quelle
Antworten:
Tl; dr
Abgesehen von der Tatsache, dass eine kompilierte ausführbare Datei möglicherweise mit einem gemeinsam genutzten Objekt, jedoch nicht mit einer ausführbaren Datei verknüpft ist, besteht kein Unterschied.
Im Allgemeinen gibt es zwei Möglichkeiten, 1 eine ausführbare Datei zu kompilieren :
Jede dieser Methoden hat Vor- und Nachteile, aber darum geht es nicht.
/bin/ntfsck
und/usr/bin/gawk
sind gemeinsam genutzte Objekte: Dies bedeutet, dass eine ausführbare Datei kompiliert und dann mit ihnen verknüpft werden kann, um ihre Funktionen zu nutzen./bin/echo
ist eine ausführbare Datei: Dies bedeutet, dass eine ausführbare Datei möglicherweise nicht kompiliert und dann mit ihr verknüpft wird, um ihre Funktionen zu nutzen.So
/bin/ntfsck
und/usr/bin/gawk
sind technisch kompilierten Bibliotheken (oder Objekte in der Perspektive des Linkers), aber, wie man forsaw haben kann, nichts verhindert , dass ein gemeinsam genutztes Objekt aus als ausführbaren Datei ausgeführt wird.Beachten Sie nebenbei auch, dass
file
Berichte (für jeden von ihnen):Dies bedeutet, dass jeder von ihnen dynamisch mit anderen gemeinsam genutzten Objekten verknüpft ist (und diese wahrscheinlich auch verwendet).
1. "Kompilieren" im weiteren Sinne, einschließlich Vorverarbeitung, Kompilieren und Verknüpfen.
quelle
Ein weiterer Unterschied besteht darin, dass ausführbare Dateien einen definierten Einstiegspunkt-Adressoffset haben, dh 0x08048000 für i386, 0x00400000 für x86 und 0x00010000 für arm.
Eine gemeinsam genutzte Objektdatei kann eine Bibliothek, aber auch eine ausführbare Datei sein. Wenn es sich um eine ausführbare Datei handelt, gibt es keinen solchen Offset. Eine gemeinsam genutzte ausführbare Objektdatei ist sozusagen eine positionsunabhängige ausführbare Datei (Positional Independent Executable, PIE), die die Adressraum-Layout-Randomisierung (ASLR) verwendet. Wenn Sie sich also die Datei / proc / pid / maps ansehen, werden Sie feststellen, dass die Position der geladenen Segmente bei jeder Ausführung anders ist als bei den Standard-ausführbaren Dateien.
Die Idee hinter dieser Funktion ist, ausführbare Dateien sicherer zu machen, indem Angreifer daran gehindert werden, Angriffe mit renditeorientierter Programmierung auszuführen. Viele Betreuer haben sich entschlossen, Pakete mit standardmäßig aktiviertem PIE zu erstellen, z. B. seit Fedora 23 oder mit Ubuntu 17.10.
quelle