Stack canary: come si aggira
Il compilatore inserisce un valore casuale (canary) tra i buffer e il return address. Prima del ret lo controlla: se è cambiato, aborta. Un overflow lineare deve attraversarlo, quindi lo altera e viene rilevato.
Le vie d'uscita
Leak: una format string o un overread stampa il canary; lo riscrivi identico nel payload.
Brute-force: nei processi che fanno fork() il canary non cambia tra i figli; lo indovini byte per byte (256 tentativi per byte).
Scrittura non lineare: un overflow che salta il canary (indice arbitrario, off-by-one su un puntatore) raggiunge il return address senza toccarlo.
Difesa
Il canary è una mitigazione, non una barriera assoluta: va combinato con ASLR, PIE, RELRO e con l'eliminazione dei bug di memoria a monte. Evita leak (niente format string, niente overread).