🩁Narnia 7

🩁Narnia 7

1 August 2023 Narnia challenges 0

De retour, non pas pour vous jouer un mauvais tour, mais plutÎt pour vous donner quelques pistes afin de réussir rapidement le challenge Narnia7.

Découverte

				
					#include 
#include 
#include 
#include 
#include 
    
int goodfunction();
int hackedfunction();

int vuln(const char *format){
        char buffer[128];
        int (*ptrf)();

        memset(buffer, 0, sizeof(buffer));
        printf("goodfunction() = %p\n", goodfunction);
        printf("hackedfunction() = %p\n\n", hackedfunction);

        ptrf = goodfunction;
        printf("before : ptrf() = %p (%p)\n", ptrf, &ptrf);

        printf("I guess you want to come to the hackedfunction...\n");
        sleep(2);
        ptrf = goodfunction;

        snprintf(buffer, sizeof buffer, format);

        return ptrf();
}

int main(int argc, char **argv){
        if (argc <= 1){
                fprintf(stderr, "Usage: %s \n", argv[0]);
                exit(-1);
        }
        exit(vuln(argv[1]));
}

int goodfunction(){
        printf("Welcome to the goodfunction, but i said the Hackedfunction..\n");
        fflush(stdout);

        return 0;
}

int hackedfunction(){
        printf("Way to go!!!!");
            fflush(stdout);
        setreuid(geteuid(),geteuid());
        system("/bin/sh");

        return 0;
}
				
			

Vous l’aurez sĂ»rement compris, pour rĂ©ussir ce challenge, il faut exĂ©cuter la fonction hackedfunction().

Dans le main, il n’y pas de vulnĂ©rabilitĂ© Ă  exploiter. Nous pouvons simplement passer un argument.

Cet argument sera ensuite passé à la fonction vuln()sous le nom de format.

Ce paramĂštre est utilisĂ© uniquement dans le snprintf. C’est en effet ici que se trouve la vulnĂ©rabilitĂ© Ă  exploiter.

Exploitation

De la mĂȘme maniĂšre que le challenge Narnia5, nous allons utiliser une vulnĂ©rabilitĂ© de type format string.

Pour rappel, les fonctions de la famille de printf, comme snprintf, ne vĂ©rifie pas forcĂ©ment le type de donnĂ©es qui lui est passĂ©, c’est ce qui les rend vulnĂ©rables.

Comme vu auparavant et grĂące aux guides donnĂ©es en Ressources, nous allons utiliser le spĂ©cifieur de format %n afin d’écrire directement sur la pile.

Ainsi, le spécifieur %n a besoin :

  • De donnĂ©es Ă  Ă©crire, dans notre cas, il s’agit de l’adresse de la fonction hackedfunction();
  • D’une destination pour Ă©crire les donnĂ©es, c’est Ă  dire Ă  l’adresse du pointeur ptrf.

Heureusement pour nous, ces donnĂ©es sont affichĂ©es par le programme Ă  chaque fois qu’on le lance.

Petit tips : L’adresse de la fonction hackedfunction() peut s’écrire au format \xff\xff\xff\xff mais pas l’adresse du pointeur ptrf, qui lui devra ĂȘtre interprĂ©table par snprintf 😊

Conclusion

Une fois de plus, vous avez toutes les clés en main pour réussir ce nouveau challenge.

La plus grande difficulté de ce challenge réside dans la compréhension du spécifieur %n et du fonctionnement des vulnérabilités de type format string.

On se retrouve dans un mois pour le dernier challenge de cette série !

Ressources