EntropyReducer: Riduci L'Entropia Del Tuo Payload E Offuscalo Con Liste Collegate Serializzate
Come Funziona
L'algoritmo EntropyReducer è determinato dai valori di BUFF_SIZE e NULL_BYTES. Di seguito è riportato come EntropyReducer organizzerebbe il tuo payload se BUFF_SIZE fosse impostato a 4 e NULL_BYTES a 2.

Algoritmo di Offuscamento
- EntropyReducer verifica innanzitutto se il payload grezzo di input ha una dimensione che sia multipla di
BUFF_SIZE; in caso contrario, lo riempie affinché lo sia.
- Successivamente prende ogni blocco di
BUFF_SIZE dal payload e ne crea un nodo di lista collegata, utilizzando la funzione InitializePayloadList, inizializzando il payload come lista collegata.
- Il nodo creato avrà un buffer vuoto di dimensione
NULL_BYTES, che verrà utilizzato per ridurre l'entropia
- A questo punto, sebbene EntropyReducer abbia completato il suo compito riducendo l'entropia del payload, non si ferma qui. Continua poi a randomizzare l'ordine di ciascun nodo nella lista collegata, scomponendo l'ordine del payload grezzo. Questo passaggio viene eseguito tramite un Algoritmo Merge Sort implementato attraverso la funzione MergeSort.
- La lista collegata ordinata è in ordine casuale perché il valore in base al quale la lista collegata viene ordinata è il valore XOR dei primi tre byte del payload grezzo; questo valore determina la sua posizione nella lista collegata riorganizzata, questo passaggio può essere visto qui
- Poiché salvare una lista collegata su file è impossibile a causa del fatto che è collegata tramite puntatori, siamo costretti a serializzarla.
- La serializzazione della lista collegata generata viene eseguita tramite la funzione
Obfuscate qui.
- Successivamente, i dati serializzati sono pronti per essere scritti nel file di output.
Algoritmo di Deoffuscamento
- Poiché l'ultimo passaggio nell'
Algoritmo di Offuscamento era la serializzazione della lista collegata, la prima cosa da fare qui è deserializzare il payload offuscato, generando da esso una lista collegata; questo passaggio viene eseguito qui nella funzione Deobfuscate.
- Il passaggio successivo è ordinare la lista collegata utilizzando l'Id del nodo, cosa che viene fatta usando lo stesso Algoritmo Merge Sort utilizzato in precedenza.
- Ora la lista collegata è nell'ordine corretto per ricostruire i byte del payload come dovrebbero essere. Quindi rimuoviamo semplicemente i byte originali del payload da ciascun nodo, come fatto qui.
- L'ultimo passaggio è liberare i nodi allocati, cosa che viene fatta qui.
Utilizzo
- EntropyReducer legge semplicemente il file del payload grezzo dalla riga di comando e scrive la versione offuscata con lo stesso nome del file prefissato da ".ER".
- La dimensione del payload offuscato finale varia in base ai valori di
BUFF_SIZE e NULL_BYTES. Tuttavia, può essere determinata utilizzando la seguente equazione
FinalSize = ((OriginalSize + BUFF_SIZE - OriginalSize % BUFF_SIZE ) / BUFF_SIZE) * (BUFF_SIZE + NULL_BYTES + sizeof(INT))
Il progetto PoC in questo repository viene utilizzato per eseguire il file ".ER" generato come esempio di deserializzazione e deoffuscamento.
Includi nei tuoi progetti
Tutto ciò che devi fare è aggiungere i file EntropyReducer.c e EntropyReducer.h al tuo progetto e chiamare la funzione Deobfuscate. Puoi consultare PoC/main.c come riferimento.
Esempio di output
In questo esempio, BUFF_SIZE è stato impostato a 3 e NULL_BYTES a 1.
- Il payload grezzo, primo chunk del payload (
FC 48 83)

- Lo stesso chunk del payload, ma a un offset diverso

Risultato
- Lo shellcode x64 calc generato da metasploit ha un'entropia di
5.883, visualizzata tramite pestudio.

- Lo stesso file, cifrato con AES, ottiene un punteggio di entropia di
7.110.

- Risultato quasi identico anche con l'algoritmo RC4;
7.210

- Utilizzando EntropyReducer invece, si ottiene un punteggio di entropia persino inferiore a quello del payload grezzo originale;
4.093

L'algoritmo Merge Sort è tratto da c-linked-list.