
Un plugin per introdurre simboli interattivi nel tuo debugger dal tuo decompilatore
Il reverse engineering coinvolge sia l'analisi statica (decompilatore) che quella dinamica (debugger), ma spesso usiamo queste analisi senza condividere conoscenze tra le due. Nel caso del reverse engineering di binari statici, il cambio di contesto tra l'assembly del debugger e i simboli che hai ricostruito nella decompilazione può essere inefficiente.
decomp2dbg mira a ridurre il divario del cambio di contesto tra decompilatore e debugger introducendo un'API generica per la sincronizzazione dei simboli dal decompilatore al debugger. In pratica, offre al reverser la potenza del proprio debugger con i simboli e le righe di decompilazione recuperati nel proprio decompilatore.

Interessato a vedere decomp2dbg in azione? Dai un'occhiata al talk registrato al CactusCon 2023, che mostra il debugging di un binario arm32 remoto da una macchina x64 con simboli di Ghidra.
Per assistenza attiva, unisciti al BinSync Discord qui sotto, dove rispondiamo alle domande su decomp2dbg:
Installa tramite pip, poi usa l'installer integrato per i decompilatori:
pip3 install decomp2dbg && decomp2dbg --install
Si aprirà un prompt in cui ti verrà chiesto di inserire il percorso del tuo decompilatore e debugger preferiti.
Per Ghidra, dovrai avviarlo in modalità PyGhidra e abilitare il plugin (d2d_client.py), come mostrato qui.
Se hai installato la parte del decompilatore tramite il Plugin Manager di Binja, devi comunque installare la parte del debugger con il comando sopra.
Nota: devi installare decomp2dbg nello stesso ambiente Python del tuo decompilatore e debugger.
Nota: Potresti dover consentire connessioni in entrata sulla porta 3662, o la porta che usi, affinché decomp2dbg si connetta al decompilatore. Se stai installando decomp2dbg con GEF o pwndbg, è importante che nel tuo ~/.gdbinit il file d2d.py sia incluso dopo GEF o pwndbg.
Salta questa sezione se sei stato in grado di usare l'installazione sopra senza errori. Se non puoi usare lo script integrato (installazione Windows non WSL per il decompilatore), segui i passaggi seguenti:
Se hai solo bisogno della parte del decompilatore, copia il plugin del decompilatore associato nella cartella dei plugin del decompilatore. Ecco come fare in IDA:
Prima, clona il repository:
git clone https://github.com/mahaloz/decomp2dbg.git
Installa:
pip install .
Copia il file del server:
cp ./decomp2dbg/d2d_server.py /path/to/ida/plugins/
Se devi anche installare la parte gdb, usa il comando seguente:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
Prima, avvia il server di decompilazione sul tuo decompilatore. Potresti voler attendere che il decompilatore termini la sua analisi normale prima di avviarlo. Dopo l'analisi normale, puoi farlo usando la combinazione di tasti Ctrl-Shift-D,
oppure selezionando la scheda decomp2dbg: configure nella scheda dei plugin associati. Dopo aver avviato il server, dovresti vedere un messaggio nel tuo decompilatore
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
Successivamente, nel tuo debugger, esegui:
decompiler connect <nome_decompilatore>
Se stai eseguendo il decompilatore su una VM o una macchina diversa, puoi opzionalmente fornire l'host e la porta a cui connetterti. Ecco un esempio:
decompiler connect ida --host 10.211.55.2 --port 3662
Puoi scoprire come usare tutti i comandi eseguendo il comando decompiler con il flag --help.
La prima connessione può richiedere fino a 30 secondi per registrarsi a seconda della quantità di globali nel binario. Se tutto va bene, dovresti vedere:
[+] Connected to decompiler!
Se stai usando decomp2dbg per una libreria, cioè il binario principale a cui il tuo debugger è collegato non è il binario per cui vuoi il sorgente, allora dovresti dare un'occhiata alla sezione Utilizzo avanzato - Librerie condivise del readme.
Ad ogni evento di breakpoint, ora vedrai stampata la decompilazione, e la riga su cui ti trovi associata all'indirizzo di break.
Le funzioni e le variabili globali della tua decompilazione sono ora mappate nel tuo GDB come normali simboli a livello di sorgente. Questo significa che i normali comandi GDB come print ed examination sono nativi:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
Alcune variabili memorizzate localmente in una funzione sono variabili di stack. Per le variabili che possono essere mappate allo stack o ai registri, le importiamo come variabili di comodo. Puoi vedere il loro contenuto come una normale variabile di comodo GDB:
p $v4
Le variabili di stack memorizzeranno sempre il loro indirizzo nello stack. Per vedere il valore effettivo in quella variabile di stack, basta dereferenziare la variabile:
x $v4
Questo funziona anche con gli argomenti di funzione, se applicabile (i risultati possono variare):
p $a1
Nota: $v4 in questo caso sarà mappato solo finché sei nella stessa funzione. Una volta uscito dalla funzione, potrebbe essere smappato o rimappato a un altro valore.
Quando vuoi che la decompilazione (e i simboli) venga visualizzata per una sezione di memoria che non è il binario principale, come durante il debug di una libreria condivisa, devi seguire alcuni passaggi extra. Attualmente, d2d supporta solo un decompilatore connesso alla volta, il che significa che se hai attualmente un decompilatore connesso che non è la libreria, devi disconnetterlo.
Dopo aver seguito la configurazione normale per avere il tuo decompilatore che esegue il server d2d per la tua libreria condivisa, devi impostare manualmente l'indirizzo di base di questa libreria e il suo indirizzo finale:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
Per trovare l'indirizzo di base a cui la tua libreria è caricata in memoria, si consiglia di usare qualcosa come il comando vmmap di GEF per cercare il nome della libreria nello spazio di memoria. Dopo esserti connesso con questo indirizzo impostato manualmente, i simboli funzioneranno come nel normale d2d. La decompilazione verrà stampata a schermo solo quando ti trovi nell'intervallo di questo spazio di indirizzi.