RelocAlloc: Uso de la sección .reloc para reemplazar las típicas llamadas de asignación
Explicando el código:
- Primero, localizamos las direcciones de todas las dlls mapeadas en nuestro proceso.
- Luego construimos un array de structs y lo llenamos con algunos datos, esa es la función Initialize().
- Ahora, tenemos un array completo, el siguiente paso es buscar la dirección correcta.
- llamar a GetSuitableAddress(SIZE_T ShellcodeSize) hará el trabajo; eso nos encuentra la cueva de código correcta (lugar vacío en memoria, que se ajuste al tamaño del shellcode)
- en caso de encontrarla, será retornada.
- para usarla debemos ajustar la protección de memoria a escribible/ejecutable ... (el poc es directamente rwx)
Demo:
img1
img2
Nota: esto solo funciona con shellcodes pequeños, porque depende de las dlls mapeadas, cuanto más grande sea la sección .reloc, mayores serán las posibilidades de obtener una dirección válida. Además, esto está probado solo en una máquina x64, pero debería funcionar para x86 (creo :p)
# STAY TUNED FOR MORE
120064592-a5c83480-c075-11eb-89c1-78732ecaf8d3