Outils d'utilisateurs

Outils du Site


overthewire_narnia:level6

Ceci est une ancienne révision du document !


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.

overthewire_narnia/level6.1362319910.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)