Le finalità di Rev.ng sono racchiuse nel suo nome: il riferimento a reverse engineering è palese. Si tratta di una piattaforma progettata per analizzare e comprendere il funzionamento interno di qualunque software. Il termine reverse engineering si riferisce al processo di decompilazione, disassemblaggio e analisi di un programma al fine di comprendere il suo funzionamento o apportare modifiche.
Uno strumento come Rev.ng consente agli utenti di decompilare e disassemblare il codice binario di un programma, consentendo loro di visualizzare il sorgente, o una rappresentazione ad esso molto vicina, dell’applicazione oggetto di studio.
In un altro articolo abbiamo visto la differenza tra disassembler e decompilatori: in breve, un disassembler traduce il codice macchina, ovvero il linguaggio binario direttamente eseguibile dalla CPU, in un linguaggio Assembly leggibile dall’uomo.
Un discompilatore, d’altra parte, è uno strumento che tenta di tradurre il codice macchina o bytecode di un programma compilato in un linguaggio di programmazione ad alto livello, come C, C++, Java o altri.
A differenza del disassemblaggio, che genera codice Assembly, il discompilatore cerca di produrre un’astrazione più alta del codice, il che rende più facile la comprensione e la modifica del programma.
Soluzioni come Rev.ng aiutano ad analizzare il funzionamento di ciascun programma. Ad esempio per identificare eventuali vulnerabilità di sicurezza, comprendere gli algoritmi utilizzati o la ricercare comportamenti dannosi.
Rev.ng può essere utilizzato per modificare il software, aggiungere funzionalità o correggere difetti, senza avere accesso al codice sorgente originale. Questo è utile per adattare il software alle proprie esigenze o per sistemare degli errori senza dover ricreare l’intero programma da zero.
Il motore di decompilazione di Rev.ng, revng-c, è adesso diventato open source. Ciò significa che il componente è disponibile per essere esaminato, utilizzato e migliorato dalla comunità.
Per utilizzare Rev.ng non è necessario disporre di privilegi di root e l’installazione si riduce a un’unica directory che può essere eliminata in qualsiasi momento.
La piattaforma supporta una vasta gamma di architetture, tra cui x86, x86-64, ARM, AArch64, MIPS e s390x, consentendo quindi lo studio di qualunque tipo di applicazione.
Di base, Rev.ng offre una versione open source del framework accessibile attraverso la riga di comando (CLI, command line interface). Attraverso l’eventuale adesione al programma beta, è possibile provare anche l’interfaccia utente in formato grafico.
Contemporaneamente, gli sviluppatori hanno a disposizione Rev.ng Hub, uno strumento che funge da punto di accesso per l’utilizzo della versione cloud della piattaforma. Gli utenti possono in questo caso creare progetti, eseguire l’interfaccia utente di Rev.ng direttamente nel browser e collaborare con altri utenti senza la necessità di installare nulla.
Per installare e provare Rev.ng su Linux, è sufficiente digitare i seguenti comandi:
curl -L -s https://rev.ng/downloads/revng-distributable/master/install.sh | bash
cd revng
source ./environment
Nella presentazione da poco pubblicata, si spiega come decompilare un programma molto semplice. Si parte con la scrittura di due righe di codice C (example.c
):
int main(int argc, char *argv[]) {
return argc * 3;
}
Si chiede quindi la compilazione con gcc
e la successiva decompilazione con Rev.ng:
gcc example.c -o example -O2
revng artifact \
--analyze \
--progress \
decompile-to-single-file \
example \
| revng ptml --color \
| grep -A2 -B1 '[^_]main\b' \
> decompiled.c
Il primo comando utilizza il compilatore gcc per compilare il sorgente di example.c
con ottimizzazioni di livello 2 (flag “-O2”). Il risultato dell’operazione di compilazione è un file eseguibile denominato example
. In generale, abilitando l’ottimizzazione di livello 2, ci si aspetta un miglioramento significativo delle prestazioni rispetto allo scenario in cui non si indica alcunché.
Successivamente, l’applicazione di reverse engineering Rev.ng è invocata per analizzare l’eseguibile example
, estrarre il codice sorgente equivalente e salvarlo in un file chiamato decompiled.c
.
La sintassi usata per invocare il comando revng
indica che si vuole analizzare un file eseguibile per comprenderne la struttura e il suo comportamento. L’opzione --progress
indica a Rev.ng di visualizzare informazioni sul progresso durante l’analisi e la fase di decompilazione; con decompile-to-single-file
si chiede di decompilare l’eseguibile in un unico file sorgente anziché in più file separati.
La decompilazione tramite revng ptml --color
converte il codice macchina dell’eseguibile in codice sorgente C e lo formatta in HTML, con la colorazione della sintassi per una migliore leggibilità.
Il risultato che si ottiene, nel caso specifico, è il seguente. Come si vede il decompilatore ha “ricostruito” il sorgente con una sintassi di alto livello che si avvicina al codice originale:
_ABI(SystemV_x86_64)
generic64_t main(generic64_t _argument0) {
return _argument0 * 3 & 0xFFFFFFFF;
}
In sintesi, Rev.ng è uno strumento potente per esperti di sicurezza informatica, sviluppatori software e ingegneri che lavorano con software per il quale non è disponibile il sorgente. Consentendo l’analisi e la modifica dei programmi binari, Reg.ng aiuta a comprendere il funzionamento dei programmi compilati effettuando modifiche secondo necessità.