Quali metodologie sono utili quando si esegue il reverse engineering del malware / shellcode?

6

Sebbene abbia familiarità con tecniche di reverse engineering dal punto di vista tecnico, non ho mai trovato una buona metodologia per l'approccio e la dissezione di malware / shellcode. Ho trovato centinaia di tutorial sugli aspetti tecnici dell'analisi del malware, ma molto poco sull'effettiva metodologia di approccio.

Alcune domande per aiutarti a capire cosa sto cercando:

  1. Come si avvia l'analisi? Cominci a main e ti distendi da lì, o hai un metodo migliore?
  2. Come trovi e identifica funzionalità importanti o funzionalità particolari a cui sei interessato?
  3. Come si mappa il flusso di controllo di alto livello?
  4. Come gestisci le routine di aiuto che hai identificato? Trovo i segnalibri insufficienti e il blocco note troppo primitivo.
  5. Come evitare di perdersi nella valanga del codice assembly?
  6. Altri trucchi / suggerimenti per approcciare questo tipo di attività?
posta Polynomial 23.08.2012 - 18:02
fonte

3 risposte

3

How do you start analysis? Do you start at main and spread out from there, or do you have a better method?

Inizia ad esaurire le analisi di base (sia dinamiche che statiche) - enumera le esportazioni, le importazioni, l'uso delle funzioni, le syscalls, le dipendenze winapi, mutex, dll, le stringhe e un po 'di grepping. Esegui analisi dinamiche su sandbox di base per giungere ad alcune, anche se parzialmente parziali e possono essere in qualche modo sbagliati, puoi ora trovare diverse teorie su alcune delle principali funzioni di eseguibile / dll.

che diceva, se stiamo parlando di java / .net ecc. - naturalmente, compili i file, ma non c'è pratica comune sull'uso di malware in tali ambienti.

Se individuate le chiamate di funzione a qualcosa di sospetto - diciamo che l'exec prova a scrivere su alcuni file di sistema / valori di registro critici, o distribuendo strani file con nome - dovreste essere preoccupati (o felici, a seconda del vostro hat-color: ))

How do you find and identify important functionality, or particular functionality that you're interested in?

Le stringhe possono essere utili: puoi individuare qualcosa di sospetto come una stringa che inizia con cmd.exe ... o anche nomi di host, combinazioni di password utente e oter Resource Hacker e dependance walker sono strumenti di base per enumerare esportazioni, importazioni e risorse incluse. La funzionalità più importante deve quasi sempre essere decodificata in IDA o analogo strumento di analisi statica.

How do you map out high level control flow?

Se tutto quanto sopra non funziona, le funzionalità grafiche di IDA sono eccezionali e possono essere utilizzate per questo.

How do you manage the helper routines you've identified? I find bookmarks to be insufficient, and notepad to be too primitive.

IDA ha un sistema di commenti, opzioni di colorazione, rinomina e altro. Per il processo di overwhole mi piace tracciare le cose quando necessario, è il modo più chiaro per farlo - anche su visio.

How do you avoid getting lost in the avalanche of assembly code?

Non hai quasi mai rev-engineering su livello ASm TUTTO il codice disponibile. Alcuni sono più efficienti nell'analisi dinamica (Olly e Immunity sono fantastici - Immunity è un fork di Olly con molti colpi di scena) e non è mai necessario che tutto il codice venga invertito per poterlo capire. Ho un codice colore in IDA e continuo a rinominare le parti già invertite con qualcosa di più sensato di "loc_402BBD"

Any other tricks / tips for approaching these kinds of tasks?

  1. Non rimanere mai bloccato in uno stato mentale, può portarti un sacco di problemi - pensa al codice di analisi per giorni e poi a ottenere una parte che cambia totalmente il tuo modo di vedere le cose, orribile.
  2. Fai pratica, molto, non c'è niente di simile, credimi.
risposta data 03.09.2012 - 23:32
fonte
3

Un metodo che adoro è utilizzare un software di monitoraggio API. Il mio preferito è quello di Rohitab (google it). Eseguo il debug del malware in questione e passo passo mentre monitoro le chiamate API effettuate sul software. Questo ti fornirà molte informazioni su ciò che il malware sta facendo. Ad esempio: il monitoraggio delle chiamate FileRead e FileWrite ti consente di sapere quali file il malware crea o legge. Si noti che questa è in qualche modo una tecnica di scatola grigia e non è puramente ingegneria inversa. Sebbene, se trovi qualcosa di interessante nel monitor API, saprai in quale parte dell'assemblaggio si trova la parte interessante.

Saluti.

    
risposta data 02.09.2012 - 05:03
fonte
2

Annuncio 1: Non importa come si inizia, è praticamente una questione di preferenza. Normalmente si inizia da main() , poiché non ci sono altre opzioni se si considera che si sta effettivamente utilizzando il codice. Importa anche cosa intendi per analisi, se questo è un passo in questo caso, main() è una buona scelta.

Annuncio 2: vedi annuncio 4.

Annuncio 3: se è scritto in assembly, molto spesso c'è un blocco principale con salti a tutte le funzioni uno per uno. Se è scritto in C, c'è anche un blocco principale che viene usato in modo simile, dato che il malware è molto spesso un piccolo pezzo di software.

Annuncio 4: etichettando tutti gli indirizzi sui nomi delle funzioni

Annuncio 5: vedi annuncio 4

Annuncio 6: puoi utilizzare le seguenti cose:

  • Disassemblatore che etichetta automaticamente tutte le chiamate alle librerie del kernel e del sistema operativo, quindi è chiaro cosa sta succedendo a questi livelli.
  • Macchina virtuale per eseguire codice - qemu, il vino è utile in questo. Non isolare, ma in realtà tracciare l'attività del malware in modo preciso, quando non è possibile utilizzare il debugger. KVM è anche una buona scelta decente.
  • Identifica i frammenti di codice e la sua funzione, ad es. capire le tecniche del compilatore e dell'autore del malware e, con questa conoscenza, passare attraverso questo è molto più facile.

In genere, la parte più difficile è iniziare, ma una volta analizzata una parte importante, ogni seconda parte di codice è più semplice. Comprendendo vari compilatori e linguaggi e il modo in cui producono il codice macchina, è molto più facile da fare.

Inoltre, avere il database delle conoscenze dei frammenti di codice e degli output del codice della macchina del compilatore aiuta molto. Questo è un compito di lunga data e farlo senza avere framework è molto difficile, soprattutto perché ci sono così tanti compilatori oggi (nuove versioni), è più difficile che mai.

    
risposta data 24.08.2012 - 00:25
fonte

Leggi altre domande sui tag