stavo leggendo questo famoso articolo:
Aleph One - Smashing The Stack per divertimento e profitto
e non ho idea di come i canarini dello stack / supporto NX / ASLR possano evitare un attacco del genere. Cercherò di spiegarmi meglio. Strettamente parlando:
- stack canaries: valori casuali prima di RET
- Supporto NX: nessun flag x per stack (e heap)
- ASLR: randomizzazione dello spazio degli indirizzi
Considerando questo esempio:
example3.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
------------------------------------------------------------------------------
In questo caso:
- I bacini di stack vengono bypassati (cambio solo il valore RET)
- Supporto NX: inutile
- ASLR: inutile (ignoro l'istruzione x = 1 aggiungendo un offset)
Non capisco come le correzioni di cui sopra possano evitare un esempio del genere.