Archives du blog

samedi 8 janvier 2011

LD_PRELOAD et HOOK PRINTF

Ayant terminé tant bien que mal le challenge Behemoth sur intruded,
je me suis lancé sur Utumno. La première épreuve était vraiment pas mal puisqu'elle n'apparait quasiment jamais dans les box qu'on nous met à disposition :) .
Sans documentations et exemples je ne serais pas allé bien loin.

Cette épreuve avait pour but j'imagine, de démontrer le lot de failles systèmes que peuvent apporter les shared libraries.
Ça m'a aussi un peu introduit au concept de Dynamic linker

J'ai eu besoin de ça :
Doc Dynamic_linker
de ça :
Doc Shared_libraries
et finalement de ça :
Fun with LD_PRELOAD

Voila à quoi on avait droit quand on voulait se renseigner sur le binaire de l'épreuve :

level1@utumno:/wargame$ file ./level1
./level1: writable, executable, regular file, no read permission

C'est pas cool...

Et quand on le lançait :

level1@utumno:/wargame$ ./level1
Read me! :P

C'est vraiment pas cool...

Donc après avoir lu tout ça on sait que LD_PRELOAD est une variable d'environnement qui contient la liste des librairies que le Dynamic_Linker a besoin de charger avant tout le monde.
Le but du challenge ici était de Hooker la fonction printf via LD_PRELOAD pour Dumper les strings contenues dans le binaire.

Imaginons qu'on ai un binaire de ce genre là :
#include <stdio.h>
int main(void)
{
    printf("hello world\n");

    return 0;
}

On pourrait balancer à LD_PRELOAD une librairie différente pour printf afin d'afficher autre chose que "hello world".

#include <stdio.h>
#include <stdlib.h
int printf(const char *format, ...)
{
 fprintf(stdout,"méchante fonction");
}

Une fois compilé en .so :


level1@utumno:/tmp$ gcc -shared print.c -o print.so
level1@utumno:/tmp$ LD_PRELOAD="/tmp/print.so" ./helloWorld
méchante fonction

Ben pour l'épreuve c'était sensiblement la même chose sauf qu'il fallait afficher les chaînes contenues dans le binaire. Ce qui prend un peu plus de temps :) .

Aucun commentaire:

Enregistrer un commentaire