Les buffers overflows les plus dangereux sont ceux qui sont sur la pile d'exécution, parce que ça peut réécrire les adresses de retour des fonctions (et exécuter le code qu'on veut)... mais les buffers overflows sur le tas peuvent mener à pas mal de conneries aussi (corruption de mémoire => crash ou parfois exécution de code arbitraire).
En général, la zone de la pile se présente approximativement de la façon suivante:
... zone mémoire en-dessous du pointeur de pile ...
|[Pointeur de pile (SP) pointe ici]|
arguments empilés pour les fonctions (à moins que tous les paramètres soient passés par registres)
variables de la fonction courante
un tableau qui nous intéresse
variables de la fonction courante
Frame Pointer (FP)
Adresse de retour
arguments empilés pour les fonctions
variables de la fonction parente
etc.
Sur ma représentation, la pile grandit du bas vers le haut.
Si on écrit les tableaux dans le sens contraire à celui où la pile grandit (tableaux écrits du haut vers le bas) - ce que la quasi-totalité des processeurs fait - on peut écrire au-delà du tableau, par-dessus les variables, FP, et l'adresse de retour.
Comme ça, si on rentre exprès du code machine dans le buffer, et que par-dessus l'adresse de retour, on écrit une adresse qui pointe dans le buffer, et bien on a pris le contrôle du processeur, et on peut exécuter des conneries.
Les buffer overflows sur la pile seraient moins dangereux si les tableaux étaient écrits dans le même sens que la pile (du bas vers le haut), puisque ça rendrait plus difficile la réécriture de l'adresse de retour (il faudrait accéder à un offset négatif par rapport au début du buffer, ce qui veut dire que le code original est mal fait - par exemple, il présente un integer overflow !).
Sur les machines évoluées (x86 modernes, par exemple), une semi-protection contre les buffer overflows sur la pile est la protection hardware (activée par l'OS) contre l'exécution de la pile. Ca rend l'exploitation plus difficile, mais pas impossible.
Voir le Month of PHP Bugs à
http://www.php-security.org/ : tout plein de trucs super mal faits dans le code de PHP, dont pas mal de buffer overflows. L'auteur du Month of PHP Bugs a essayé d'améliorer la sécurité de PHP de l'intérieur pendant des années, mais il a fini par en avoir marre d'être mal considéré par les principaux développeurs PHP, que beaucoup de modifs très importantes pour la sécurité ne soient pas effectuées, et que plein de conneries d'architecture soient ajoutées.