mein Code ist wie folgt: preload.c, mit folgendem Inhalt:LD_PRELOAD betrifft neues Kind auch nach unsetenv ("LD_PRELOAD")
#include <stdio.h>
#include <stdlib.h>
int __attribute__((constructor)) main_init(void)
{
printf("Unsetting LD_PRELOAD: %x\n",unsetenv("LD_PRELOAD"));
FILE *fp = popen("ls", "r");
pclose(fp);
}
dann in der Schale (vorsichtig den zweiten Befehl tun !!):
gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
LD_PRELOAD=./mylib.so bash
!!! Seien Sie vorsichtig mit dem letzten Befehl wird es mit Endlosschleife der Gabelung "sh-c ls" ergeben. Stoppen Sie es nach 2 Sekunden mit^C, (oder besser^Z und dann siehe ps).
Mehr Infos
- Dieses Problem beziehen sich in irgendeiner Weise einzuschlagen; Entweder als der Befehl, den der Benutzer ausführt, oder als bash der popen ausgeführt wird.
- zusätzliche Schlüsselfaktoren: 1) Führen Sie die popen aus der vorinstallierten Bibliothek, 2) Wahrscheinlich müssen Sie den Popen im Abschnitt Initialisierung der Bibliothek tun.
wenn Sie verwenden:
LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
anstelle des letzten Befehls, werden Sie viele ld-Debug-Dateien erhalten, mit dem Namen /tmp/ld-debug.*. Eine für jeden gegabelten Prozess. IN ALLEN DIESEN DATEIEN sehen Sie, dass Symbole in mylib.so zuerst durchsucht werden, obwohl LD_PRELOAD aus der Umgebung entfernt wurde.
In welcher Sprache sprechen wir? – mvds
wir sprechen über die C-Sprache – avner
@ user395074, dann sollten Sie Ihre Tags möglicherweise an die Sprache angepasst haben (klicken Sie auf den Link "Bearbeiten"). Außerdem scheint das [preloader] -Tag nicht die OS-Komponente zu reflektieren, über die wir sprechen. –