Ceci est une ancienne révision du document !
ssh narnia6@narnia.labs.overthewire.org pass : neezocaeng
#include <stdio.h> #include <stdlib.h> #include <string.h> extern char **environ; int main(int argc, char *argv[]){ char b1[8], b2[8]; int (*fp)(char *)=(int(*)(char *))&puts, i; if(argc!=3){ printf("%s b1 b2\n", argv[0]); exit(-1); } /* clear environ */ for(i=0; environ[i] != NULL; i++) memset(environ[i], '\0', strlen(environ[i])); /* clear argz */ for(i=3; argv[i] != NULL; i++) memset(argv[i], '\0', strlen(argv[i])); strcpy(b1,argv[1]); strcpy(b2,argv[2]); if(((unsigned long)fp & 0xff000000) == 0xff000000) exit(-1); fp(b1); exit(1); }
Le programme enregistre l'adresse de la fonction puts
dans la variable fp
. Il copie ensuite le contenu de argv[1]
et argv[2]
dans les deux buffers. Nous allons donc pouvoir écrire par dessus l'adresse de la fonction puts
qui a été enregistré. Cependant, le programme vérifie que l'adresse de la fonction ne commence par par 0xff
, ce qui correspond aux adresses de de la stack. Nous allons donc devoir contourner cette protection.