systemadmin.es > Seguridad > Substituir llamadas a funciones de librerías

Substituir llamadas a funciones de librerías

Mediante LD_PRELOAD podemos cargar librerías que substituyan a otras o simplemente cargar alguna. Esto se puede usar para substituir llamadas a funciones de librerías.

Primero deberemos coger la definición de la función a substituir, vamos a suponer que queremos substituir la función getcwd:

char *getcwd(char *buf, size_t size);

Deberemos crear una librería que implemente dicha función, por ejemplo:

#include <unistd.h>

char *getcwd(char *buf, size_t size)
{
	return "8====D";
}

Compilamos:

$ gcc -Wall -fPIC -shared -o getcwd.so getcwd.c 

Y lo pasamos al binario al que queremos substituir la función, por ejemplo pwd:

$ LD_PRELOAD="./getcwd.so" /bin/pwd 
8====D
Segmentation fault (core dumped)

El segmentation fault se debe no a la substitución (ya que vemos que se muestra) sino lo que haga a continuación con el valor devuelto. En este caso, podemos encontrar en la documentación que:

The caller should free(3) the returned buffer. 

Por lo que si lo modificamos añadiendo el malloc:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char *getcwd(char *buf, size_t size)
{
	char * ret=malloc(6);
	
	snprintf(ret,6,"8===D");
	
	return ret;
}

Ya funcionará correctamente:

$ gcc -Wall -fPIC -shared -o getcwd.so getcwd.c 
$ LD_PRELOAD="./getcwd.so" /bin/pwd 
8===D

Podemos ver otro ejemplo con fork()

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>