Stack Overflow
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Un desbordamiento de pila es una vulnerabilidad que ocurre cuando un programa escribe más datos en la pila de los que se le ha asignado para contener. Este exceso de datos sobrescribirá el espacio de memoria adyacente, lo que llevará a la corrupción de datos válidos, interrupción del flujo de control y potencialmente a la ejecución de código malicioso. Este problema a menudo surge debido al uso de funciones inseguras que no realizan comprobaciones de límites en la entrada.
El principal problema de esta sobrescritura es que el puntero de instrucción guardado (EIP/RIP) y el puntero base guardado (EBP/RBP) para regresar a la función anterior están almacenados en la pila. Por lo tanto, un atacante podrá sobrescribir esos y controlar el flujo de ejecución del programa.
La vulnerabilidad generalmente surge porque una función copia dentro de la pila más bytes de la cantidad asignada para ella, pudiendo así sobrescribir otras partes de la pila.
Algunas funciones comunes vulnerables a esto son: strcpy
, strcat
, sprintf
, gets
... Además, funciones como fgets
, read
& memcpy
que toman un argumento de longitud, podrían usarse de manera vulnerable si la longitud especificada es mayor que la asignada.
Por ejemplo, las siguientes funciones podrían ser vulnerables:
La forma más común de encontrar desbordamientos de pila es dar una entrada muy grande de A
s (por ejemplo, python3 -c 'print("A"*1000)'
) y esperar un Segmentation Fault
que indique que se intentó acceder a la dirección 0x41414141
.
Además, una vez que encuentres que hay una vulnerabilidad de desbordamiento de pila, necesitarás encontrar el offset hasta que sea posible sobrescribir la dirección de retorno, para esto se suele utilizar una secuencia de De Bruijn. La cual, para un alfabeto dado de tamaño k y subsecuencias de longitud n, es una secuencia cíclica en la que cada posible subsecuencia de longitud _n_** aparece exactamente una vez** como una subsecuencia contigua.
De esta manera, en lugar de necesitar averiguar manualmente qué offset se necesita para controlar el EIP, es posible usar como relleno una de estas secuencias y luego encontrar el offset de los bytes que terminaron sobrescribiéndola.
Es posible usar pwntools para esto:
o GEF:
Durante un desbordamiento (suponiendo que el tamaño del desbordamiento sea lo suficientemente grande) podrás sobrescribir valores de variables locales dentro de la pila hasta alcanzar el EBP/RBP y EIP/RIP guardados (o incluso más). La forma más común de abusar de este tipo de vulnerabilidad es modificando la dirección de retorno para que cuando la función termine, el flujo de control se redirija a donde el usuario especificó en este puntero.
Sin embargo, en otros escenarios, tal vez solo sobrescribir algunos valores de variables en la pila podría ser suficiente para la explotación (como en desafíos CTF fáciles).
En este tipo de desafíos CTF, hay una función dentro del binario que nunca se llama y que necesitas llamar para ganar. Para estos desafíos solo necesitas encontrar el desplazamiento para sobrescribir la dirección de retorno y encontrar la dirección de la función a llamar (generalmente ASLR estaría deshabilitado) para que cuando la función vulnerable regrese, se llame a la función oculta:
Ret2winEn este escenario, el atacante podría colocar un shellcode en la pila y abusar del EIP/RIP controlado para saltar al shellcode y ejecutar código arbitrario:
Stack ShellcodeEsta técnica es el marco fundamental para eludir la principal protección de la técnica anterior: Pila no ejecutable (NX). Y permite realizar varias otras técnicas (ret2lib, ret2syscall...) que terminarán ejecutando comandos arbitrarios al abusar de instrucciones existentes en el binario:
ROP - Return Oriented ProgramingUn desbordamiento no siempre va a estar en la pila, también podría estar en el montículo, por ejemplo:
Heap OverflowHay varias protecciones tratando de prevenir la explotación de vulnerabilidades, consúltalas en:
Common Binary Exploitation Protections & BypassesAprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)