Post

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.

Pwndbg gadgets

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.

Pwndbgoffset

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.

ldd

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:

lib

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.

lib

This post is licensed under CC BY 4.0 by the author.