Estaba leyendo este famoso artículo:
Aleph One: rompiendo la pila por diversión y beneficio
y no tengo idea de cómo stack canaries / NX support / ASLR puede evitar un ataque así. Intentaré explicarme mejor. Hablando estrictamente:
- apilar canarios: valores aleatorios antes de RET
- Compatibilidad con NX: no hay un indicador x para la pila (y el montón)
- ASLR: aleatorización de espacio de direcciones
Teniendo en cuenta este ejemplo:
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);
}
------------------------------------------------------------------------------
En este caso:
- Los canarios de pila se omiten (solo cambio el valor RET)
- soporte NX: inútil
- ASLR: inútil (omito la instrucción x = 1 agregando un desplazamiento)
No entiendo cómo las soluciones anteriores pueden evitar un ejemplo como ese.