il mio codice è il seguente: preload.c, con il seguente contenuto:LD_PRELOAD colpisce nuovo figlio anche dopo 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);
}
poi nel guscio (fare il 2 ° comando con cura !!):
gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
LD_PRELOAD=./mylib.so bash
!!! stai attento con l'ultimo comando che si otterrà con un ciclo infinito di biforcazioni "sh -c ls". Fermalo dopo 2 secondi con^C, (o meglio^Z e poi vedi ps).
Maggiori informazioni
- Questo problema si riferiscono per colpire in qualche modo; o come comando che l'utente esegue, o come bash che il popen esegue.
- fattori chiave aggiuntivi: 1) eseguire il popen dalla libreria precaricata, 2) probabilmente è necessario eseguire il popen nella sezione di inizializzazione della libreria.
se si utilizza:
LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
al posto dell'ultimo comando, si ottengono molti file LD-debug, denominata /tmp/ld-debug.*. Uno per ogni processo biforcato. IN TUTTI QUESTI FILES vedrai che i simboli vengono prima cercati su mylib.so anche se LD_PRELOAD è stato rimosso dall'ambiente.
di quale lingua stiamo parlando? – mvds
stiamo parlando del linguaggio C – avner
@ user395074, quindi, forse, dovresti aver regolato i tuoi tag per riflettere la lingua (fai clic sul link "modifica"). Inoltre, il tag [preloader] non sembra riflettere il componente del sistema operativo che stiamo discutendo. –