tutorial solucion programacion pila monticulo example desbordamiento camara security buffer-overflow exploit

security - solucion - ¿Cómo se usan los desbordamientos de buffer para explotar las computadoras?



desbordamiento de pila (5)

Este es el documento más conocido sobre el tema: Aplastando la pila por diversión y ganancias

Sin embargo, ''desbordamientos de pila'' no tienen nada que ver con desbordamientos de búfer. Los desbordamientos de pila generalmente son solo un caso de error en el código incorrecto que no puede explotarse para nada fuera de un bloqueo (DoS).

Editar: también preguntaste sobre desbordamientos de montón. Este es un buen documento sobre el tema: http://www.w00w00.org/files/articles/heaptut.txt

¿Cómo se usan los desbordamientos de buffer para explotar las computadoras?

¿Cómo se puede ejecutar código arbitrario simplemente causando desbordamientos de pila o montón ?

Entiendo que las partes de la memoria de los programas se sobrescriben y no se supone que lo sean, pero no veo cómo esto lleva a uno a ejecutar su propio código. Además, ¿el código malicioso de terceros debe escribirse en el lenguaje ensamblador de procesadores de destino?


Imagina dos casas en la calle. Una es la casa de tu amigo y otra es la casa de su malvado vecino paranoico tres puertas más abajo. El vecino paranoico malvado nunca entra o sale, y su lugar está cerrado con llave.

Ahora, tu amigo es un amigo tan confiable, que te dejará almacenar cualquier cosa en su lugar, colocando cajas una detrás de la otra, comenzando en una pared. De hecho, es tan buen amigo que seguirá poniendo cajas una detrás de la otra, sin verificar si está pegado a la pared, hasta que sigan en el aire y finalmente atraviesen otras dos casas en la calle y hacia adentro. la casa del vecino paranoico malvado. Pero tu amigo confía en que no harás eso porque le gustas (y es un poco ingenuo).

Entonces tienes la oportunidad de poner algo en la casa del vecino malvado paranoico explotando a tu amigo bueno y confiado.

Reemplace los siguientes términos y verá la analogía de un ataque de desbordamiento de búfer:

  • "la casa de su amigo" -> "una parte de un programa que no verifica el desbordamiento del búfer"
  • "la casa de su vecino paranoico malvado" -> "otra porción de un programa que se supone que es seguro"
  • "boxes" -> "argumentos / parámetros para el programa que no verifica el desbordamiento del búfer"

Esto solo tiene éxito si alguien descubre dónde está el área segura de la memoria, y qué tendría que pasar como argumento para el programa en cuestión, que terminaría en el área segura, para tener el efecto deseado. (si se trata de datos o código que hace que se ejecute el código del explotador)


La pila contiene datos y dirección de retorno cuando salta a una subrutina. Si logras poner una dirección específica en la pila donde está la dirección de retorno, puedes forzar a la CPU a saltar a una ubicación de memoria particular, en la que colocas tu propio código. Eso es para desbordamientos de búfer. El desbordamiento del montón es un poco diferente y más difícil de explotar.

Los desbordamientos de pila son solo una indicación de que se ha quedado sin espacio en la pila (que generalmente es más limitado, especialmente en el kernel).


Prácticamente todos los procesadores modernos al llamar a una subrutina, empuja la dirección de retorno en la misma área que los datos locales (pila). Para las rutinas que no verifican el límite superior de una variable (en particular, la función strcpy), puede producirse una redirección de direcciones de instrucción (desbordamiento de búfer).

void make(char *me) { char sandwich[4]; // local data, this is in stack. the buffer for data is too small strcpy(sandwich, me); puts(sandwich); // implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address } void main() { // calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction''s address(getchar line) on stack before jumping to make. make("Love Not War"); getchar(); puts("This will not execute. The address to next instruction(getchar) gets overwritten with Not War"); }

"Además, ¿el código malicioso de terceros debe estar escrito en el lenguaje ensamblador de procesadores de destino?"

El desbordamiento de pila puede ocurrir a partir de un programa que se ejecuta normalmente, por ejemplo, rutinas recursivas (función que se llama a sí misma) con una condición de terminación pasada por alto. El área de pila se llenará con numerosas variables locales en la pila más las direcciones de retorno.


El enfoque normal es que tienes en algún lugar en la memoria el código malicioso. Luego, crea un desbordamiento de búfer: la magia aquí no es hacerlo simplemente desbordamiento, pero como ya lo mencionó, ciertas partes de la memoria del programa se sobrescriben. Como la pila contiene no solo las variables, sino también cuando una función se llama dirección de retorno, se intenta sobrescribir esta con la dirección de su código malicioso. Cuando la función con el desbordamiento del búfer vuelve a su llamador, la función no vuelve a su llamador original sino a la subrutina maliciosa. Como el código ahora ejecutado tiene usualmente los privilegios del código de llamada, uno trata de encontrar / crear estos desbordamientos en el código que tiene un permiso más alto que el código maligno (de lo contrario, puede hacerlo llamando directamente a la rutina del mal).