Solución Ropemporium pivot
Introducción
Al leer el enunciado, sacamos las siguientes conclusiones. Lo primero que tenemos que hacer después de sobrescribir es hacer un call a foothold_function()
y luego poner el offset de ret2win()
. También nos comenta que hay varias posibilidades de solucionar esto con puts(): podemos filtrar valores del binario y luego redirigir el flujo del programa al main()
.
Exploración de Gadgets
Vamos a explorar qué tenemos en el programa para hacer el challenge. Si abrimos pwndbg y hacemos un disassemble uselessFunction
, podemos ver que la función hace un call a foothold_function()
, que sabemos en el enunciado que es lo primero que tenemos que enviar. Luego tenemos usefulGadgets
, de lo cual son importantes pop eax
y xchg esp, eax
, que básicamente nos permiten controlar eax
mediante el valor del stack de esp
.
Buscando los offsets
Vamos primero a buscar el offset. Primero creamos un pattern con cyclic. Seguidamente, ejecutamos el binario y nos pedirá un primer input. Ese no es importante, podemos poner lo que queramos. El siguiente es el importante, allí pondremos el pattern. Una vez recibamos el segmentation fault, copiamos el valor de ret
y se lo pasaremos a cyclic
, así obtendremos el offset de 40, como podemos ver en la siguiente imagen.
Ossets de las funciones
Ahora vamos a buscar los offsets de las funciones que tenemos que llamar, ya que no están dentro del binario. Si hacemos un ldd
, podemos ver las librerías compartidas, como se muestra en la siguiente imagen.
Vamos a mirar la librería con readelf -s libpivot.so
. Veremos los offsets de ret2win
y foothold_function
. El problema es que no podemos calcular el offset por el momento, ya que cambia. Necesitaremos primero filtrar la base address del paso anterior.
Empezaremos buscando el pop rdi; ret
, usaremos ropper
como en los challenges anteriores:
0x0000000000400a33: pop rdi; ret;
Buscamos offsets de ret2win
y foothood
, como se muestra en la siguiente imagen:
Stack pivot
Para hacerlo, necesitaremos pop rax; ret;
y xchg rax, esp; ret;
. Podemos usar ropper
mismo, aunque en la primera imagen de este post se muestra el pop rax
que es este.
0x00000000004009bb: pop rax; ret;
Y el xchg rax, esp; ret;
0x00000000004009bd: xchg rsp, rax; ret;
Exploit
Mediante el uso de la biblioteca pwn, automatizamos todo esto. Construimos payloads específicos para llamar a foothold_function
, filtrar direcciones importantes y realizar el stack pivot.