mi código es el siguiente: preload.c, con el siguiente contenido:LD_PRELOAD afecta nuevo niño, incluso después de 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);
}
a continuación en la cáscara (hacer el segundo comando con cuidado !!):
gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
LD_PRELOAD=./mylib.so bash
!!! tenga cuidado con el último comando que resultará con un bucle infinito de bifurcación "sh -c ls". Deténgalo después de 2 segundos con^C, (o mejor^Z y luego vea ps).
Más información
- Este problema se refieren a golpear de alguna manera; ya sea como el comando que el usuario ejecuta, o como el bash que ejecuta el popen.
- adicionales Factores clave: 1) realizar el popen desde la biblioteca precargada, 2) probablemente necesite hacer el popen en la sección de inicialización de la biblioteca.
si utiliza:
LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
en lugar del último comando, recibirá muchos archivos ld-depuración, llamado /tmp/ld-debug.*. Uno para cada proceso bifurcado. EN TODOS ESTOS ARCHIVOS verá que los símbolos se buscan por primera vez en mylib.so aunque LD_PRELOAD se eliminó del entorno.
¿De qué idioma estamos hablando? – mvds
estamos hablando del lenguaje C – avner
@ user395074, entonces, tal vez, debería haber ajustado sus etiquetas para reflejar el idioma (haga clic en el enlace "editar"). Además, la etiqueta [preloader] no parece reflejar el componente del SO que estamos discutiendo. –