
Strumento IDAPython per la creazione automatica di tabelle virtuali C++ in IDA Pro
Virtuailor è uno strumento IDAPython che ricostruisce le vtable per codice C++ scritto per architettura Intel, sia a 32 bit che a 64 bit, e AArch64 (Nuovo!). Lo strumento è composto da 2 parti, statica e dinamica.
La prima è la parte statica, che contiene le seguenti capacità:
La seconda è la parte dinamica, che contiene le seguenti capacità:
Virtuailor ora supporta le versioni di IDA dalla 7.0 fino alla più recente (7.5). Se stai usando una versione di IDA precedente alla 7.4, dovrai passare al branch beforeIDA-7.4; il branch master supporta la versione più recente disponibile (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # Puoi cambiare l'intervallo di indirizzi delle chiamate virtuali
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Opzionale, ma estremamente raccomandato: crea uno snapshot del tuo idb. Basta premere ctrl+shift+t e creare uno snapshot.
Premi File->Run script... poi vai nella cartella di Virtuailor e scegli di eseguire Main.py. Puoi vedere la seguente gif per una spiegazione più chiara e visiva.

Ora la GUI ti fornirà un'opzione per scegliere un intervallo da targetizzare; nel caso volessi targetizzare l'intero binario, premi OK con i valori predefiniti negli indirizzi di inizio e fine.
Successivamente, i breakpoint verranno posizionati nel tuo codice e tutto ciò che devi fare è eseguire il tuo codice con il debugger IDA, eseguire le azioni che desideri e osservare come la vtable viene costruita! Per AArch64 puoi impostare un server gdb remoto e fare debug usando il debugger IDA.
Nel caso non volessi/avessi più bisogno dei breakpoint, vai alla scheda dell'elenco breakpoint in IDA ed elimina i breakpoint come preferisci.
È anche molto importante per me notare che questa è la seconda versione dello strumento con supporto sia a 32 che a 64 bit e aarch64. Probabilmente in alcuni casi una piccola quantità di breakpoint verrà persa; in questi casi per favore apri un issue e contattami in modo che io possa migliorare il codice e aiutare a risolvere. Grazie in anticipo per questo :)
Le strutture che Virtuailor crea dalla vtable utilizzata nelle chiamate virtuali che sono state colpite. Le funzioni della vtable vengono estratte dalla memoria in base al registro pertinente utilizzato nell'opcode del BP.
Poiché volevo creare una correlazione tra la struttura in IDA e le vtable nella sezione dati, il BP cambia il nome dell'indirizzo della vtable nella sezione dati con il nome della struttura. Come puoi vedere nell'immagine seguente:

Anche i nomi delle funzioni virtuali vengono cambiati, tranne in situazioni in cui i nomi non sono i nomi IDA predefiniti (funzioni con simboli o funzioni che l'utente ha cambiato). In questi casi i nomi delle funzioni rimarranno invariati e verranno anche aggiunti alla struttura vtable con il loro nome attuale.
I nomi scelti sono costruiti usando il seguente pattern:
Dopo aver creato la vtable, Virtuailor aggiunge anche una connessione tra la struttura creata e l'assembly, come puoi vedere nelle immagini seguenti:

P.S: L'offset di struttura utilizzato nel BP è rilevante solo per l'ultima chiamata effettuata. Per ottenere una comprensione migliore di tutte le chiamate virtuali effettuate, è stata aggiunta la funzionalità xref come spiegato nella prossima sezione
Quando si fa reverse engineering di C++ in modo statico, non è banale vedere chi ha chiamato chi, poiché la maggior parte delle chiamate sono chiamate indirette. Tuttavia, dopo aver eseguito Virtuailor, ogni funzione che è stata chiamata indirettamente ora ha un xref verso quelle posizioni.
La seguente gif mostra gli xref aggiunti con la loro chiamata di funzione indiretta:

Lo strumento è stato presentato a RECon Brussels, Troopers e Warcon. La presentazione può essere trovata al seguente link: https://www.youtube.com/watch?v=Xk75TM7NmtA
REcon Brussels, Troopers, Warcon crews, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
Il plugin è concesso in licenza sotto la GNU GPL v3.