
Implementazione in shellcode di Reflective DLL Injection. Converte DLL in shellcode indipendente dalla posizione.
sRDI permette la conversione di file DLL in shellcode indipendenti dalla posizione. Tenta di essere un caricatore PE completamente funzionale che supporta permessi di sezione adeguati, callback TLS e controlli di integrità. Può essere pensato come un caricatore PE in shellcode legato a una DLL impacchettata.
La funzionalità è realizzata tramite due componenti:
Questo progetto è composto dai seguenti elementi:
La DLL non deve essere compilata con RDI, tuttavia la tecnica è cross-compatibile.
Prima dell'uso, ti consiglio di familiarizzare con Reflective DLL Injection e il suo scopo.
from ShellcodeRDI import *
dll = open("TestDLL_x86.dll", 'rb').read()
shellcode = ConvertToShellcode(dll)
DotNetLoader.exe TestDLL_x64.dll
python ConvertToShellcode.py TestDLL_x64.dll
NativeLoader.exe TestDLL_x64.bin
Import-Module .\Invoke-Shellcode.ps1
Import-Module .\ConvertTo-Shellcode.ps1
Invoke-Shellcode -Shellcode (ConvertTo-Shellcode -File TestDLL_x64.dll)
Il codice del caricatore PE utilizza l'argomento flags per controllare le varie opzioni della logica di caricamento:
SRDI_CLEARHEADER [0x1]: L'intestazione DOS e lo stub DOS per la DLL target vengono completamente cancellati con byte nulli al caricamento (tranne e_lfanew). Questo potrebbe causare problemi con le API Windows standard quando si fornisce l'indirizzo di base come pseudo HMODULE.SRDI_CLEARMEMORY [0x2]: Dopo aver chiamato le funzioni nel modulo caricato (DllMain e qualsiasi esportazione), i dati della DLL verranno cancellati dalla memoria. Questo è pericoloso se ci si aspetta di continuare a eseguire codice al di fuori del modulo (Thread / GetProcAddressR).SRDI_OBFUSCATEIMPORTS [0x4]: L'ordine delle importazioni nel modulo verrà randomizzato prima di iniziare la patch dell'IAT. Inoltre, i 16 bit alti del flag possono essere usati per memorizzare il numero di secondi da attendere prima di elaborare l'importazione successiva. Ad esempio, flags | (3 << 16) sospenderà per 3 secondi tra ogni importazione.SRDI_PASS_SHELLCODE_BASE [0x8]: Invece di passare i dati utente forniti alla funzione esportata, sRDI passerà invece l'indirizzo di base del blocco shellcode attualmente in esecuzione. Questo può essere utile per l'auto-pulizia all'interno di moduli più avanzati.Questo progetto è compilato con Visual Studio 2019 (v142) e Windows SDK 10. Lo script python è scritto con Python 3.
Gli script Python e Powershell si trovano in:
Python\ConvertToShellcode.pyPowerShell\ConvertTo-Shellcode.ps1Dopo la compilazione del progetto, gli altri binari si troveranno in:
bin\NativeLoader.exebin\DotNetLoader.exebin\TestDLL_<arch>.dllbin\ShellcodeRDI_<arch>.binSe desideri aggiornare i blob statici all'interno di uno qualsiasi degli strumenti:
> python .\lib\Python\EncodeBlobs.py -h
usage: EncodeBlobs.py [-h] solution_dir
sRDI Blob Encoder
positional arguments:
solution_dir Solution Directory
optional arguments:
-h, --help show this help message and exit
> python lib\Python\EncodeBlobs.py C:\code\srdi
[+] Updated C:\code\srdi\Native/Loader.cpp
[+] Updated C:\code\srdi\DotNet/Program.cs
[+] Updated C:\code\srdi\Python/ShellcodeRDI.py
[+] Updated C:\code\srdi\PowerShell/ConvertTo-Shellcode.ps1
Se trovi il mio codice disgustoso, o stai semplicemente cercando un progetto alternativo di caricatore memory-PE, dai un'occhiata a questi:
La base di questo progetto deriva da "Improved Reflective DLL Injection" di Dan Staples che a sua volta deriva dal progetto originale di Stephen Fewer.
Il framework del progetto per compilare codice C come shellcode è preso dalla ricerca di Mathew Graeber "PIC_BindShell"