Ret2win
Información Básica
Los desafíos de Ret2win son una categoría popular en competiciones de Capture The Flag (CTF), especialmente en tareas que involucran explotación binaria. El objetivo es explotar una vulnerabilidad en un binario dado para ejecutar una función específica no invocada dentro del binario, a menudo nombrada como win
, flag
, etc. Esta función, al ejecutarse, generalmente imprime una bandera o un mensaje de éxito. El desafío típicamente implica sobrescribir la dirección de retorno en la pila para desviar el flujo de ejecución hacia la función deseada. Aquí tienes una explicación más detallada con ejemplos:
Ejemplo en C
Considera un programa simple en C con una vulnerabilidad y una función win
que pretendemos llamar:
Para compilar este programa sin protecciones de pila y con ASLR deshabilitado, puedes usar el siguiente comando:
-m32
: Compila el programa como un binario de 32 bits (esto es opcional pero común en desafíos de CTF).-fno-stack-protector
: Deshabilita las protecciones contra desbordamientos de pila.-z execstack
: Permite la ejecución de código en la pila.-no-pie
: Deshabilita el Ejecutable de Posición Independiente para asegurar que la dirección de la funciónwin
no cambie.-o vulnerable
: Nombre el archivo de salida comovulnerable
.
Exploit en Python usando Pwntools
Para el exploit, utilizaremos pwntools, un potente marco de trabajo de CTF para escribir exploits. El script de exploit creará un payload para desbordar el búfer y sobrescribir la dirección de retorno con la dirección de la función win
.
Para encontrar la dirección de la función win
, puedes usar gdb, objdump, u otra herramienta que te permita inspeccionar archivos binarios. Por ejemplo, con objdump
, podrías usar:
Este comando mostrará el ensamblado de la función win
, incluyendo su dirección de inicio.
El script de Python envía un mensaje cuidadosamente elaborado que, al ser procesado por la vulnerable_function
, desborda el búfer y sobrescribe la dirección de retorno en la pila con la dirección de win
. Cuando vulnerable_function
retorna, en lugar de regresar a main
o salir, salta a win
, y se imprime el mensaje.
Protecciones
PIE debe estar deshabilitado para que la dirección sea confiable en ejecuciones sucesivas, de lo contrario la dirección donde se almacenará la función no será siempre la misma y se necesitaría alguna filtración para averiguar dónde se encuentra cargada la función
win
. En algunos casos, cuando la función que causa el desbordamiento esread
o similar, se puede realizar un Sobrescribir Parcial de 1 o 2 bytes para cambiar la dirección de retorno y que apunte a la funciónwin
. Debido a cómo funciona ASLR, los últimos tres nibbles hexadecimales no se aleatorizan, por lo que hay una probabilidad de 1/16 (1 nibble) de obtener la dirección de retorno correcta.Los Canarios de Pila también deben estar deshabilitados o la dirección de retorno comprometida de EIP nunca será seguida.
Otros ejemplos y Referencias
32 bits, sin ASLR
64 bits con ASLR, con una filtración de la dirección binaria
64 bits, sin ASLR
32 bits, sin ASLR, doble desbordamiento pequeño, primero para desbordar la pila y aumentar el tamaño del segundo desbordamiento
32 bits, relro, sin canario, nx, sin pie, cadena de formato para sobrescribir la dirección
fflush
con la funciónwin
(ret2win)32 bits, nx, nada más, sobrescribir parcialmente EIP (1 byte) para llamar a la función
win
32 bits, nx, nada más, sobrescribir parcialmente EIP (1 byte) para llamar a la función
win
El programa solo valida el último byte de un número para verificar el tamaño de la entrada, por lo tanto es posible agregar cualquier tamaño siempre que el último byte esté dentro del rango permitido. Luego, la entrada crea un desbordamiento de búfer explotado con un ret2win.
64 bits, relro, sin canario, nx, pie. Sobrescribir parcialmente para llamar a la función
win
(ret2win)arm64, PIE, proporciona una filtración de PIE, la función
win
en realidad son 2 funciones, por lo que el gadget ROP llama a 2 funcionesARM64, off-by-one para llamar a una función
win
Ejemplo ARM64
pageRet2win - arm64Última actualización