The Information Systems and Computer Applications examination covers material that is usually taught in an introductory college-level business information systems course.

Hookeando funciones de librerías (y acertar la función a hookear)

Ejecutando un programa, cargaba una librería que introducía tiempos muertos en medio de la ejecución del proceso. Con strace vemos:

$ strace ./Sample1
(...)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({10, 0},

Así que me propuse eliminar estos retardos hookeando la función con LD_PRELOAD

Yendo directo a por nanosleep, implementé la función para que devolviera 0 directamente:

int nanosleep(const struct timespec *req, struct timespec *rem)
{
	return 0;
}

La sorpresa vino cuando el proceso hacía el nanosleep igual como si nada hubiera pasado:

LD_PRELOAD="./nanoquick.so" strace ./Sample1
(...)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({10, 0}, 

Así que, mirando los símbolos que no tiene resueltos (U) mediante nm:

# nm -D /usr/local/lib/libLenta.so | awk ' $1 == "U" {print $2;}'__ctype_b_loc
__ctype_tolower_loc
__strdup
__strtok_r
abort
calloc
fprintf
fputc
free
fwrite
malloc
memcpy
memmove
memset
realloc
sleep
snprintf
stderr
strcat
strchr
strcmp
strncasecmp
strncmp
strstr

Destaca que la llamada que hace no es a nanosleep, sino a sleep. Por lo tanto, dicha librería llama a sleep y este a nanosleep, como vemos en el strace. Pero, como que ha llamado a sleep ya se encuentra en la libc, por lo que ya tiene resuelto el símbolo para nanosleep y por esto no pasa por nuestro hook.

Por lo tanto, en lugar de hacer el hook para nanosleep lo deberemos hacer para sleep, que es el símbolo que busca:

unsigned int sleep(unsigned int seconds)
{
	return 0;
}

Con esto ya podemos eliminar el tiempo muerto de dicho programa.

Tags: , ,

Relacionados

Hookeando funciones de librerías (y acertar la función a hookear) was first posted on October 4, 2013 at 9:33 am.

Comments are closed.