Introduction à LD_PRELOAD

Hier, j’ai rédigé et publié un article indiquant la manière dont j’ai résolu le level 1 du Wargame utumno sur Intruded.

Après avoir posté, un ami m’a indiqué qu’il n’était pas forcément bien vu de divulguer les réponses de challenges publiques et je pense qu’il n’a pas forcément tord sur ce point.

De ce fait, j’ai décidé de remanier mon article afin de vous montrer la voie sans forcément trop en dire  😉

Nous allons donc aborder dans cet article comment nous servir de la variable d’environnement LD_PRELOAD afin d’usurper (hooker) certaines fonctions d’un programme accessible seulement en exécution.

Prenons le code source test.c suivant :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv) {
printf(“Un p0n3y peut en cacher un autre”);
}

On le compile et on lui attribue des droits d’exécution pour les autres utilisateurs que le propriétaire.

Moon:/tmp# gcc test.c -o test
Moon:/tmp# chmod 711 test
Moon:/tmp# su un_autre_utilisateur
Moon:/tmp$ ./test
Un p0n3y peut en cacher un autre
Moon:/tmp$
Moon:/tmp$ file test
test: executable, regular file, no read permission

Notre but ici, va être d’usurper la fonction printf() afin d’afficher ce que l’on veut.

Pour cela, nous allons utiliser la variable d’environnement LD_PRELOAD afin de charger une librairie à la place des bibliothèques de bases.

Voici donc le code source test1.c contenant la fonction que l’on souhaite usurper et affichant un texte quelconque :

#include ;
#include ;
#include ;
 
int printf(const char *format,) {
fprintf(stdout,”hook un jour, hook toujours”);
}

On compile maintenant notre code source test1.c en librairie test1.so :

Moon:/tmp$ gcc -fPIC -shared test1.c -o test1.so

On importe maintenant notre librairie afin qu’elle hook la fonction printf().

Moon:/tmp$ LD_PRELOAD= « /tmp/test1.so » /tmp/test
hook un jour, hook toujours
Moon:/tmp$

Well done ! nous avons réussi ! (ça mérite bien un coca).

Bon l’exemple était ici assez simple mais on peut s’imaginer d’autres scénarios d’attaques en utilisant cette méthode.

Pour exemple, je vous recommande chaudement d’effectuer le level 1 du Wargame Utumno qui utilise le même principe.

Pour indice supplémentaire, il est nécessaire de savoir que le fait de hooker une des fonctions d’un binaire permet de partager son espace mémoire. On peut donc s’imaginer de pouvoir lire en mémoire le binaire (bien qu’à la base nous n’avons aucun droit en lecture).

Également, pour vous aider un peu plus, je vous recommande l’article et la vidéo suivante :

Reverse Engineering avec LD_PRELOAD

Organisation du Système et de la mémoire

Bon courage !

2 Responses to "Introduction à LD_PRELOAD"

  • Nicolas says:
  • Nicolas says:
Laissez un commentaire