Domanda:
metodologia di reverse engineering
Othman
2016-05-17 21:31:50 UTC
view on stackexchange narkive permalink

Sono nuovo nel reverse engineering e sto seguendo il corso in linea fornito dal sito opensecurity.info.
L'autore fornisce una metodologia per il reverse engineering. Raccomanda di trovare una funzione di interesse e di codificarla pseudo.
Dalla formulazione usata, sembra che dovrei invertire l'intera funzione dall'inizio alla fine.
È davvero questa la pratica consigliata?
Se la mia domanda non è abbastanza chiara, ecco un caso ipotetico: diciamo che voglio capire il protocollo di comunicazione utilizzato per lo scambio di dati tra un malware e il server di comando e controllo. Diciamo che ho trovato la chiamata recv e questa chiamata è nel mezzo di una funzione sconosciuta.
Dovrei davvero invertire questa funzione sconosciuta dall'inizio o dovrei concentrarmi sull'area del codice all'interno di questa funzione che chiama "recv" e andare da lì?

Due risposte:
joxeankoret
2016-05-18 19:20:55 UTC
view on stackexchange narkive permalink

Devo davvero invertire questa funzione sconosciuta dall'inizio

Disclaimer : questa è solo la mia opinione. Detto questo, la mia risposta: no , non farlo a meno che non sia davvero necessario. Una delle prime cose che dico sempre ai miei studenti quando insegno ingegneria inversa è in realtà questa: non provare mai a decodificare una funzione riga per riga a meno che non sia davvero necessario (e la mia esperienza dice che la maggior parte delle volte tu non è necessario).

La mia raccomandazione è leggermente diversa:

  • Trova "artefatti" che possono darti un'idea astratta di cosa fa una funzione: nomi di funzioni chiamate / referenziate (ad esempio, API), costanti, ecc ...
  • Dopo aver avuto un'idea astratta di ciò che fa la funzione, determinare se è necessario ottenere maggiori informazioni da essa.
  • In tal caso, prova a determinare raggruppando i blocchi di base ma senza analizzare riga per riga, cosa fa un insieme di blocchi di base, cercando di concentrarti su ciò che non capisci o su cosa devi rispondere.
  • Se hai ancora bisogno di maggiori dettagli o qualcosa non è ancora chiaro, fallo blocco di base per blocco di base seguendo il flusso dal punto che non è chiaro o dal punto in cui inizi a interessarti.
  • Se , ancora, tu n Hai più informazioni o non è ancora chiaro, fallo istruzione per istruzione cercando di concentrarti specificamente su ciò che non capisci o su cosa devi rispondere e, solo se ancora non puoi rispondere alle tue domande, ricorri a invertire l'intera funzione riga per riga linea.

Provando a passare istruzione per istruzione o invertendo l'intera funzione quando non ne abbiamo davvero bisogno, è più facile perdersi / confondersi perché ci concentreremo su ciò che fanno alcune istruzioni oscure o su quali flag cambia invece di concentrandosi nel rispondere alle domande reali. Tuttavia, dipenderà in gran parte dal motivo per cui stai decodificando quella cosa. Stai cercando di imitare / copiare / estendere un algoritmo (cioè un algoritmo di decrittazione) o recuperare il codice sorgente per un binario? Quindi, sì, dovrai andare istruzione per istruzione. Stai decodificando un pezzo di software / funzione per determinare cosa fa? In generale, no, non è necessario andare istruzione per istruzione.

I miei 2 centesimi.

Non esiste una "metodologia", ci sono solo costrutti immaginari scritti da persone a caso. Se esistesse una metodologia di ingegneria del software, la applicheresti al contrario: D Esistono buone pratiche, tuttavia, e ciò che Joxean descrive è una di queste.
Chris Tsiakoulas
2016-05-18 18:35:29 UTC
view on stackexchange narkive permalink

Ti suggerisco di dare un'occhiata anche al codice del resto. Trovare qualcosa di specifico può sicuramente essere un passo avanti, ma una riga di codice, specialmente in assembly, non può fare molto da sola. Guarda l'esempio che hai dato. Hai scoperto come comunica il tuo malware. È abbastanza? Probabilmente no. Qual è la natura di questa comunicazione? È un guscio inverso? Viene utilizzato per trasferire file? Ci sono molte domande diverse a cui rispondere e - credimi - sarai molto fortunato se riesci a trovarle tutte nello stesso punto del codice. Guarda sempre il codice intorno all'area di interesse che hai. Potresti trovare funzioni che chiamano altre funzioni che fanno cose interessanti usando il canale di comunicazione. Una cosa porta l'altra e alla fine della giornata, ti fornirà la struttura e la funzionalità complete del malware.

P.S. Usa sempre i punti di interruzione quando passi da una funzione all'altra.

Buona caccia!



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...