Ret2esp / Ret2reg
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)
Ret2esp
Debido a que el ESP (Puntero de Pila) siempre apunta a la cima de la pila, esta técnica implica reemplazar el EIP (Puntero de Instrucción) con la dirección de una instrucción jmp esp
o call esp
. Al hacer esto, el shellcode se coloca justo después del EIP sobrescrito. Cuando se ejecuta la instrucción ret
, ESP apunta a la siguiente dirección, precisamente donde se almacena el shellcode.
Si la Aleatorización del Espacio de Direcciones (ASLR) no está habilitada en Windows o Linux, es posible utilizar las instrucciones jmp esp
o call esp
encontradas en bibliotecas compartidas. Sin embargo, con ASLR activo, es posible que sea necesario buscar estas instrucciones dentro del programa vulnerable mismo (y es posible que necesites vencer PIE).
Además, poder colocar el shellcode después de la corrupción de EIP, en lugar de en medio de la pila, asegura que cualquier instrucción push
o pop
ejecutada durante la operación de la función no interfiera con el shellcode. Esta interferencia podría ocurrir si el shellcode se colocara en medio de la pila de la función.
Falta de espacio
Si te falta espacio para escribir después de sobrescribir RIP (quizás solo unos pocos bytes), escribe un shellcode jmp
inicial como:
Y escribe el shellcode al principio de la pila.
Ejemplo
Puedes encontrar un ejemplo de esta técnica en https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp con un exploit final como:
Puedes ver otro ejemplo de esta técnica en https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Hay un desbordamiento de búfer sin NX habilitado, se utiliza un gadget para reducir la dirección de $esp
y luego un jmp esp;
para saltar al shellcode:
Ret2reg
De manera similar, si sabemos que una función devuelve la dirección donde se almacena el shellcode, podemos aprovechar las instrucciones call eax
o jmp eax
(conocido como técnica ret2eax), ofreciendo otro método para ejecutar nuestro shellcode. Al igual que eax, cualquier otro registro que contenga una dirección interesante podría ser utilizado (ret2reg).
Ejemplo
Puedes encontrar algunos ejemplos aquí:
strcpy
almacenará eneax
la dirección del buffer donde se almacenó el shellcode yeax
no está siendo sobrescrito, por lo que es posible usar unret2eax
.
ARM64
Ret2sp
En ARM64 no hay instrucciones que permitan saltar al registro SP. Podría ser posible encontrar un gadget que mueva sp a un registro y luego salte a ese registro, pero en la libc de mi kali no pude encontrar ningún gadget como ese:
Las únicas que descubrí cambiarían el valor del registro donde se copió sp antes de saltar a él (por lo que se volvería inútil):
Ret2reg
Si un registro tiene una dirección interesante, es posible saltar a ella simplemente encontrando la instrucción adecuada. Podrías usar algo como:
En ARM64, es x0
quien almacena el valor de retorno de una función, por lo que podría ser que x0 almacene la dirección de un búfer controlado por el usuario con un shellcode para ejecutar.
Código de ejemplo:
Revisando el desensamblado de la función es posible ver que la dirección del buffer (vulnerable a bof y controlado por el usuario) está almacenada en x0
antes de retornar del desbordamiento de buffer:
También es posible encontrar el gadget br x0
en la función do_stuff
:
Utilizaremos ese gadget para saltar a él porque el binario se compila SIN PIE. Usando un patrón es posible ver que el desplazamiento del desbordamiento de buffer es 80, por lo que el exploit sería:
Si en lugar de fgets
se hubiera utilizado algo como read
, habría sido posible evadir PIE también solo sobrescribiendo los últimos 2 bytes de la dirección de retorno para regresar a la instrucción br x0;
sin necesidad de conocer la dirección completa.
Con fgets
no funciona porque añade un byte nulo (0x00) al final.
Protecciones
NX: Si la pila no es ejecutable, esto no ayudará ya que necesitamos colocar el shellcode en la pila y saltar para ejecutarlo.
Referencias
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)
Last updated