raisep0wn

Geek Stuff & IT Security

NDH 2k10 Public WarGame level5

leave a comment »


Code source de l’épreuve :

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

// gcc -o level5 level5.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2

void setArray(int frame, int value) {
	int array[32];

	array[frame] = value;
	printf("fill case %d with %d.\n", frame, value);
	return;
}

int main(int argc, char **argv) {
	if (argc != 3)
		printf("syntax: %s [slot] [val]\n", argv[0]);
	else
		setArray(atoi(argv[1]), atoi(argv[2]));
	exit(0);
}

Cette fois, il s’agit d’un débordement de tableau, c’est plus original. Le programme nous permet d’écrire dans une cellule du tableau, et bien sûr, aucune vérification n’est faite, ce qui nous permet d’écrire au-delà dudit tableau. Nous remarquons que la cellule 33 pointe vers SEIP. (Soit par dichotomie, soit à l’aide de gdb, mais nous n’allons pas sortir les débuggeurs dès le niveau 4 tout de même). Nous pouvons donc aisément rediriger le flux d’exécution. Cependant, nous ne pouvons plus écrire notre shellcode sur la pile… Enfin, à première vue. L’astuce consiste à cacher notre shellcode dans une variable d’environnement dont nous pouvons déterminer l’adresse mémoire à l’aide de la fonction C getenv(« env name »). Ensuite, il suffit de faire pointer EIP dessus, seulement il ne faut pas oublier de convertir l’adresse hexadécimal en décimal.

Publicités

Written by Ralph

28/05/2011 à 08:05

Publié dans IT Security

Tagged with , ,

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :