Analisi di reverse engineering di Formbook, un info-stealer che utilizza la manipolazione di assembly .NET e la decifratura XOR. Payload completo estratto tramite x32dbg, inclusi il ciclo di decifratura XOR, l'inizializzazione CLR, l'esca SQLExpress e le API di keylogger/appunti.
Il dump di memoria di x32dbg rivela che Formbook decifra i dati della propria configurazione e alloca memoria per essi utilizzando NtAllocateVirtualMemory.
NtAllocateVirtualMemory – Alloca memoria per il payload decifrato.mov edx, dword ptr ds:[esi+1C] – Recupera la dimensione dei dati cifrati dal registro ESI.push 0x1000 – Utilizza MEM_COMMIT per allocare memoria.push 0 – Specifica il tipo di allocazione o il flag di protezione.mov edx, dword ptr ds:[esi+4] – Recupera un altro valore di configurazione.lea ecx, [ebp-4] – Carica un puntatore a una variabile locale.test ecx, ecx – Verifica se il puntatore è valido.mov ecx, [esi+1C] – Recupera nuovamente la dimensione dei dati cifrati.push 0x1000 – Ripete il flag MEM_COMMIT.push 0 – Ripete il flag di allocazione.ConnectionStrings – Chiave di configurazione .NET per gli indirizzi C2.system.data, DbProviderFactories – Sezioni di configurazione .NET (probabilmente esche).system.serviceModel – Sezione del modello di servizio .NET.<DbProviderFactories /> – Elemento XML vuoto (esca).ConnectionStrings contiene probabilmente URL C2.
Vista di x32dbg che mostra NtAllocateVirtualMemory e la decifratura di ConnectionStrings.
Questa vista di x32dbg rivela che Formbook utilizza la manipolazione di assembly .NET, la decifratura basata su XOR e l'inizializzazione del CLR (Common Language Runtime) per eseguire il proprio payload.
xor eax, eax – Azzera EAX, indicando una decifratura basata su XOR.call 0x6C6E7F60 – Chiama una funzione di decifratura o di elaborazione.call 0x6C6EE8B0 – Chiama un'altra funzione di elaborazione.DllCanUnloadNowInternal – Gestisce il caricamento/scaricamento di assembly .NET.PublicKeyToken=31bf3856ad364e35 – Impersona un assembly Microsoft.system.serviceModel – Configurazione del modello di servizio .NET (comunicazione C2).System.Web – Configurazione web .NET (C2 basato su HTTP).clr.NGenCreateNGenWorker – Crea un worker del .NET Native Image Generator.clr.GetCLRFunction – Recupera funzioni CLR.return to clr.Initialize – Inizializza il runtime .NET.xor eax, eax e le successive funzioni call confermano la decifratura basata su XOR.PublicKeyToken lo fa apparire come un assembly Microsoft.system.serviceModel e System.Web memorizzano le impostazioni C2.
Vista di x32dbg che mostra la decifratura XOR, DllCanUnloadNowInternal e l'inizializzazione CLR.
Questa vista di x32dbg rivela che Formbook utilizza una stringa correlata a SQLExpress come esca e inizializza il CLR .NET per eseguire il proprio payload.
L"ce=..\SQLEXPR" – Una stringa esca, non correlata al furto di dati SQL. Viene utilizzata per far apparire il malware come un componente legittimo di SQL Server Expressclr.InitializeFusion – Inizializza il loader di assembly .NET Fusion, utilizzato per caricare il payload .NET in memoria.clr.GetCLRFunction – Recupera funzioni CLR per eseguire codice gestito.clr.NGenCreateNGenWorker – Crea un worker del .NET Native Image Generator, consentendo al payload di essere eseguito senza compilazione JIT.return to clr.InitializeFusion+1751 – Ritorna alla routine di inizializzazione del CLR.SQLEXPR è un'esca per eludere il rilevamento da parte degli strumenti di sicurezza.
Vista di x32dbg che mostra L"ce=..\SQLEXPR", clr.InitializeFusion e le funzioni CLR.
Questa vista di x32dbg rivela l'avvio del payload di Formbook, situato dopo il messaggio standard dello stub DOS del PE. Il malware utilizza un ciclo di decifratura XOR per decifrare il proprio payload in memoria.
This program cannot be run in DOS mode – Messaggio standard dello stub DOS del PE.xor dword ptr ds:[edi], eax – Esegue lo XOR dei dati in EDI con EAX (decifratura).mov al, byte ptr ds:[edi+1] – Carica un byte da EDI+1 in AL.xor al, byte ptr ds:[edx+1] – Esegue lo XOR di AL con il byte in EDX+1 (chiave di decifratura).mov byte ptr ds:[edi], al – Riscrive il byte decifrato in EDI.call ntdll.77DDE45C – Chiama RtlIsCurrentThreadAttachExempt (anti-debug).cmp dword ptr ds:[esi+4], 0 – Verifica se il contatore (ESI+4) è zero.sub dword ptr ds:[esi+4], eax – Decrementa il contatore.test edx, edx – Verifica se EDX è zero.jne ntdll.77DDF9F4 – Torna indietro se non è zero (ciclo di decifratura).RtlIsCurrentThreadAttachExempt per eludere i debugger.
Vista di x32dbg che mostra il ciclo di decifratura XOR dopo il messaggio standard dello stub DOS del PE.
L'analisi con Binary Ninja del payload estratto rivela un elenco completo di API utilizzate da Formbook per il keylogging, il dirottamento della clipboard e l'escalation di privilegi.