Smashing The Stack For Fun And Profit
Todo proceso se divide en 3 regiones
Texto
La región de texto se fija por el programa e incluye código (instrucciones)
de datos y de sólo lectura.
incluye
código (instrucciones)
de
datos
sólo lectura
Datos
La región de datos contiene
datos inicializados
datos no inicializados
Pila
Es un tipo abstracto de datos de uso frecuente en la informática.
Tiene la propiedad de que el último objeto colocado en la pila
será el primer objeto eliminado.
A esta propiedad se le conoce como LIFO
Una pila es un bloque contiguo de datos de memoria que contiene
Un registro de llamada
un puntero de pila (SP)
que
apunta a la parte superior de la pila
Además del puntero de pila, lo que apunta a la parte superior de la pila
(bajo dirección numérica) a menudo es un puntero de marco (FP)
que
apunta a un lugar fijo dentro de un marco
que también
se utiliza para asignar dinámicamente las variables locales utilizadas en
funciones
El pisado de pila o stack smashing
es un
tipo de desbordamiento de buffer que es aprovechado
por
algunos virus
y
otros programas maliciosos
Un desbordamiento de buffer es el resultado de relleno de más datos en un buffer de los
que puede manejar
esto
nos permite cambiar la dirección de retorno de una función
permite cambiar el flujo de ejecución del programa
El problema que se enfrenta al tratarse del desbordamiento del buffer
es
tratar de averiguar en qué dirección de la memoria intermedia será
por lo tanto conociendo
donde la pila comienza, podemos tratar de adivinar dónde el buffer se desbordará
Búsqueda de desbordamiento de buffer
Si el destino de cualquiera de estas funciones es un buffer de tamaño estático
y
su otro argumento fuera alguna derivada de la entrada del usuario
no
es una buena
posibilidad de que se pueda explotar, o mejor dicho, prevenir un desbordamiento de buffer
el uso de un bucle while
para
leer un carácter a la vez en un buffer de la entrada estándar
o
para leer algún archivo hasta que se alcanza el final de la línea, el final del archivo
o
con algún otro delimitador
lo cual
lleva a que si no hay controles explícitos para desbordamientos en el bucle while
estos programas son fácilmente explotados
Si la expansión de los datos o la pila de usuario
agota la memoria disponible
entonces
el proceso se bloquea y se reprograma para
correr de nuevo con un espacio de memoria más grande