
Plug-in per Binary Ninja per identificare codice offuscato e altri costrutti di codice interessanti
Autore: Tim Blazytko
Rileva automaticamente codice offuscato e altre interessanti strutture di codice
Obfuscation Detection è un plugin per Binary Ninja che rileva codice offuscato e interessanti costrutti di codice (ad es. macchine a stati) nei binari. Dato un binario, il plugin semplifica l'analisi identificando le posizioni del codice che potrebbero meritare un'analisi più approfondita durante il reverse engineering.
Basandosi su varie euristiche, il plugin individua funzioni che contengono costrutti di codice complessi o insoliti. Tali costrutti possono implementare
I seguenti articoli del blog forniscono ulteriori informazioni sulle euristiche sottostanti e ne mostrano i casi d'uso:
Alcuni esempi di casi d'uso si trovano in examples. Inoltre, il talk REcon "Unveiling Secrets in Binaries using Code Detection Strategies" mostra alcuni casi d'uso. Le slide sono disponibili qui; la registrazione è disponibile qui.
Lo strumento può essere installato utilizzando il gestore plugin di Binary Ninja.
Per la versione headless, seguire questi passaggi:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# install obfuscation_detection
pip install .
Il plugin può essere utilizzato nell'interfaccia utente e in modalità headless.
Scegliere Plugins -> Obfuscation Detection per eseguire singole euristiche, oppure Plugins -> Obfuscation Detection -> Utils per eseguire singole rilevazioni di utilità. Il comando Plugins -> Obfuscation Detection -> All esegue tutte le euristiche e tutte le utilità insieme.
I risultati vengono visualizzati nella finestra Log:
Facendo clic sugli indirizzi delle funzioni identificate, Binary Ninja naviga alla funzione selezionata.
Per utilizzare il plugin in modalità headless, eseguire scripts/detect_obfuscation.py:
$ python3 scripts/detect_obfuscation.py <binary>
Questo esegue tutte le euristiche e tutte le utilità. Per un output leggibile dalla macchina, utilizzare --json:
$ python3 scripts/detect_obfuscation.py --json <binary>
Il payload JSON contiene tutti i risultati sotto la chiave detections. Ogni rilevazione ha un id stabile per l'automazione e un name leggibile dall'uomo. Ogni risultato di funzione etichettata include il tipo di tag e la descrizione utilizzati dal plugin Binary Ninja.
Per eseguire solo l'euristica della macchina a stati in modalità headless, utilizzare scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binary>
Il plugin implementa varie euristiche di rilevamento per individuare diversi costrutti di codice. Di seguito descriviamo brevemente le singole euristiche e ne spieghiamo l'utilizzo.
L'euristica del blocco di base grande identifica il 10% superiore delle funzioni con il numero medio più alto di istruzioni per blocco di base. Permette di rilevare
L'euristica della funzione complessa identifica il 10% superiore delle funzioni con i grafi di controllo del flusso più complessi (basati sulla complessità ciclomatica). Permette di identificare
L'euristica della macchina a stati utilizza proprietà della teoria dei grafi per identificare funzioni che implementano macchine a stati. Di solito, tali macchine a stati possono essere rappresentate come istruzioni switch che vengono smistate in un ciclo. L'euristica permette di identificare
L'euristica della sequenza di istruzioni insolita esegue un'analisi statistica per identificare il 10% superiore delle funzioni i cui pattern di codice si discostano da una verità di base precalcolata. In questo modo, l'euristica permette di identificare
L'euristica dell'istruzione sovrapposta identifica funzioni con istruzioni disallineate (i byte dell'istruzione sono condivisi da due istruzioni diverse). L'euristica identifica
Se l'euristica viene utilizzata nell'interfaccia utente di Binary Ninja, le istruzioni sovrapposte vengono anche evidenziate nella vista a grafo.
L'euristica della funzione più chiamata identifica il 10% superiore delle funzioni con il maggior numero di chiamate da funzioni diverse. In questo modo, l'euristica può identificare
L'euristica identifica funzioni con un numero elevato di cicli. Queste funzioni potrebbero implementare
L'euristica aiuta anche a individuare potenziali colli di bottiglia nelle prestazioni.
L'euristica identifica funzioni con strutture di ciclo rare e complesse che tipicamente suggeriscono
L'euristica identifica funzioni che eseguono un'operazione XOR con una costante all'interno di un ciclo. In questo modo, l'euristica può identificare
L'euristica identifica funzioni in cui le espressioni hanno più di un'operazione aritmetica e più di un'operazione booleana contemporaneamente. In questo modo, l'euristica può identificare
L'euristica utilizza un approccio iterativo di hashing del contesto per rilevare strutture multi-blocco ripetute all'interno del grafo di controllo del flusso di ciascuna funzione. Confrontando la firma dell'opcode di ogni blocco insieme alle firme dei suoi successori, l'euristica identifica sottografi duplicati o quasi duplicati in una singola funzione. Questo aiuta a individuare:
Il plugin include anche utilità più mirate per funzioni e regioni di codice interessanti. Rimangono disponibili nel sottomenu Utils; il comando All le esegue insieme alle euristiche più ampie.
Questa utilità identifica funzioni senza chiamanti noti. Queste funzioni potrebbero essere
Questa utilità identifica funzioni che non chiamano altre funzioni. Queste funzioni possono, ad esempio, essere funzioni che
Questa utilità identifica funzioni ricorsive — funzioni che chiamano se stesse direttamente o indirettamente. Le funzioni ricorsive possono indicare:
Questa utilità valuta l'entropia di ogni sezione. L'entropia è una misura statistica di casualità con valori compresi tra 0 e 8. Sezioni con entropia vicina a 8 indicano un alto grado di casualità e possono suggerire:
Questa utilità rileva potenziali implementazioni dell'algoritmo RC4 utilizzando marcatori euristici tipicamente associati all'algoritmo di schedulazione delle chiavi (KSA) e all'algoritmo di generazione pseudo-casuale (PRGA) di RC4. RC4 è ampiamente utilizzato nei malware per scopi quali:
Per maggiori informazioni, contattare @mr_phrazer.