Cada vulnerabilidad tiene una causa específica, que a su vez conduce a formas de explotar la vulnerabilidad. Es difícil entender cómo se puede explotar algo abstracto y obtener algunos resultados abstractos, pero es mucho más fácil de entender cuando se ilustra con ejemplos. El más simple sería el clásico desbordamiento de búfer basado en pila:
void f(const char *str) {
char buf[10];
strcpy(buf, str);
}
Este es un ejemplo primitivo que debería ser suficiente para demostrar el problema. Supongamos que el argumento str
apunta a una cadena terminada en NULL más larga que los 10 caracteres asignados para la variable en la que se está copiando. ¿Lo que sucederá? strcpy()
copiará ciegamente los datos al final del búfer, sobrescribiendo lo que haya allí. Pero, ¿qué es exactamente ?
En x86, por ejemplo, la variable buf
se asignaría en la pila. La pila también se usa para guardar la dirección de retorno cuando se ejecuta una instrucción CALL
. Así que el diseño de la pila (simplificado) se vería así (las direcciones aumentan de arriba a abajo):
...
buf[0..3]
buf[4..7]
buf[8..9]
return address
...
Entonces, al proporcionar una cadena demasiado larga a través del argumento str
, podríamos sobrescribir la dirección de retorno de f()
. Si el atacante puede controlar la cadena, entonces puede controlar dónde irá el flujo de control después de que f()
regrese. Esto puede ocurrir al analizar un archivo especialmente diseñado, por ejemplo.
Lo siguiente sería dirigir el control a una instrucción JMP ESP
o similar en efecto, haciendo que se ejecute el código de la pila. Esta ejecución del código "directo" se evita mediante DEP.
Por supuesto, el ejemplo anterior no incluye omitir ninguna de las mitigaciones modernas (apilar canarios, SafeSEH, DEP). Esto no significa que sea globalmente imposible, pero puede ser imposible en ciertos casos. La omisión de DEP generalmente implica Programación orientada al retorno : en lugar de código, los datos especialmente diseñados se colocan en la pila. que utiliza fragmentos de funciones ya existentes en la imagen de proceso (llamadas gadgets) para ejecutar el código. Esto, a su vez, se ve atenuado por ASLR, lo que hace que las direcciones de los gadgets sean algo impredecibles. También existen técnicas para evitar ASLR.
Si desea obtener información sobre cómo explotar programas de la vida real, sugeriría tutoriales de corelanc0d3r como punto de partida.
EDIT : reemplazó la parte infractora.