đŠNarnia 7
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, commesnprintf, 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\xffmais pas lâadresse du pointeurptrf, qui lui devra ĂȘtre interprĂ©table parsnprintf
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 !
Recent Comments