security - tutorial - ataques de desbordamiento de pila
que es stack overflow (1)
¿Cómo se realizan los ataques de desbordamiento de pila?
En caso de ataques de stackoverflow, el atacante reemplaza la dirección de retorno de la función por su dirección.
¿Cómo se hace esto en ataques de desbordamiento de pila? Además, ¿es posible ejecutar código desde el montón?
Tenga en cuenta que esto varía según la plataforma, y mi ejemplo está demasiado simplificado. Básicamente, se trata de administradores de pila que tienen listas vinculadas que podrían ser invadidas, y puede usar los punteros de la lista enlazada para sobrescribir partes aleatorias de la memoria del proceso.
Imagina que tengo una implementación de pila ingenua cuyos bloques de control son así:
struct HeapBlockHeader
{
HeapBlockHeader* next;
HeapBlockHeader* prev;
int size;
// Actual heap buffer follows this structure.
};
Cuando se libera el montón, este bloque de control vuelve a la lista de bloques liberados, modificando el puntero siguiente / anterior. Si rebaso un búfer de pila, puedo sobrescribir los punteros en el siguiente bloque de control con los datos que controlo. Supongamos que anulo estos enlaces para apuntar a un puntero a código (probablemente solo en el búfer que he sobrepasado) y a la dirección de retorno de la función en la pila. Cuando el administrador del montón intenta volver a vincular el bloque en una lista liberada, en realidad sobrescribirá la dirección de retorno en la pila con un puntero al código que controlo.
Este artículo tiene una buena descripción general sobre los ataques de desbordamiento del montón: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html
Este artículo describe parte del fortalecimiento que se produjo en el administrador del montón de Vista para evitar este tipo de ataque: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf
EDIT: En la posibilidad de ejecutar código desde el montón, sí es posible. Muchas plataformas ahora hacen que la memoria de pila no sea ejecutable por defecto, lo que levanta la barrera para que se ejecute un código arbitrario. Sin embargo, aún puede realizar un ataque de estilo "saltar a libc": sobrescriba la dirección de retorno a una función conocida que será ejecutable.