STACK-THREE amd64

Este nivel nos enseña a sobrescribir los punteros de funciones para alterar el flujo del binario.

En este caso vamos a mirar primero el ensamblador y después contrastaremos lo descubierto con el código fuente.

UTILIZANDO EL DEPURADOR

Como en todos los anteriores, lo primero es utilizar rabin2 para obtener más información del binario:

stack-three. rabin2

Después lo podemos abrir en nuestro depurador, analizar todo y comprobar las funciones para ver qué estamos buscando:

stack-three. r2 afl

Podemos observar las funciones gets, puts, fflush y exit, por lo que podemos asumir que se utilizan dentro del binario.

Por otro lado, llegados a este punto vemos algo muy interesante. Además de la función main, también vemos una función llamada complete_level. Ahora toca analizar en profundidad ambas funciones:

  • main:

stack-three. main
stack-three. main graph
  • complete_level:

stack-three. complete_level

Como en el ejercicio anterior, vamos a analizar el código. En este caso vamos a analizar primero main y posteriormente complete_level:

De lo leído anteriormente, vemos que en un momento dado de la función main se llama a una función cuyo puntero se encuentra almacenado en una variable, concretamente en [rbp - 0x10].

Además, antes de eso se ha introducido datos por stdin con la función gets en la variable que se encuentra almacenada en [rbp - 0x50].

Sabemos que la función gets tiene problemas de seguridad y es explotable para escribir en direcciones de memoria cercanas. En este caso, solo tenemos que escribir 0x50 - 0x10 bytes para empezar a sobrescribir el puntero de la función. Esto son 64 bytes.

Otra cosa a tener en cuenta es: ¿Qué dirección debo poner en el puntero para ganar el reto?

Lo importante para ganar este reto es redirigir el flujo de programa hacia la función complete_level. Por tanto, debemos introducir la dirección de la primera instrucción de este función en el puntero para redirigirme a ella. En este caso 0x0040069d.

A continuación prepararemos el exploit y después confirmaremos que lo anterior es correcto.

PREPARANDO EL EXPLOIT

Ahora que ya sabemos cómo funciona el binario y creemos saber como explotarlo, vamos a preparar un exploit en python para comprobar que estábamos en lo cierto:

stack-three. exploit.py

Con este exploit, podemos ejecutar el binario para comprobar si hemos modificado el valor del puntero y trata de acceder a la función almacenada en 0x43434343.

por poco!

Ya hemos comprobado que nuestro analisis del código ensamblador ha sido correcto. Ahora podemos modificar el exploit para obtener el resultado que esperamos y vencer el reto:

exploit definitivo
Victoria

Otra vez, no ha sido necesario conocer el código fuente para explotar el binario.

CÓDIGO FUENTE

Después de comprobar que el exploit funciona podemos analizar el código fuente para comprobar qué hacía el binario exactamente.

Última actualización

¿Te fue útil?