Software reverse engineering is a complex process aimed to recover design and implementation information of the software under analysis. It is a very time-consuming activity that requires experience, knowledge of the underlying platforms, and tools that help reverse engineers in the static and dynamic analysis process. Compiler optimizations and code obfuscation make this process much harder for the reverse engineer and the existing tools are not usually designed to deal with such aspects. This work proposes a static analysis framework that helps the reverse engineer in the task of binary function recognition. In particular, it aims to recognize inlined method calls of template classes through a binary fingerprinting and matching approach. Our fingerprint model captures lexical and syntactic features of an assembly function, along with its Control-Flow Graph structure. Through the use of fingerprints and (sub)graph isomorphism algorithms, we are able to recognize inlined method calls in a target binary application. Additionally, the proposed framework automates the fingerprints generation phase by parsing the source code of the template classes. We performed our experiments on a dataset of GitHub projects tagged as C++. Such projects have been compiled with several optimization levels that allow the compiler to inline function calls. The resulting binaries have been tested with fingerprints generated from the methods of the std::map and std::vector template classes. The results on the most known methods of these classes, like the operator[ ] of the map class and the push_back method of the vector class, show an accuracy that averages around 20%.

Il software reverse engineering è un processo complesso volto a recuperare informazioni di progettazione e di implementazione del software sotto analisi. È un'attività molto dispendiosa in termini di tempo che richiede esperienza, conoscenza delle tecnologia utilizzata e strumenti che aiutano il reverse engineer nel processo di analisi statica e dinamica. Le ottimizzazioni del compilatore e l'offuscamento del codice rendono questo processo molto più difficile per il reverse engineer e gli strumenti esistenti di solito non sono progettati per affrontare tali aspetti. Questo lavoro propone un framework di analisi statica per aiutare il reverse engineer nel riconoscimento di funzioni binarie. In particolare, mira a riconoscere le chiamate ai metodi inlined di classi template attraverso un approccio di fingerprinting e corrispondenza binario. Il nostro modello di fingerprint cattura le caratteristiche lessicali e sintattiche di una funzione assembly, insieme alla sua struttura del grafico del flusso di controllo. Con l'utilizzo delle fingerprint e di algoritmi di isomorfismo di (sotto)grafi siamo in grado di riconoscere le chiamate ai metodi inlinate in una designata applicazione binaria. Inoltre, il framework proposto automatizza la fase di generazione delle fingerprint analizzando il codice sorgente delle classi template. Abbiamo eseguito i nostri esperimenti su progetti GitHub etichettati come C++.Tali progetti sono stati compilati con diversi livelli di ottimizzazione per consentire al compilatore di inlinare le chiamate a funzioni. I relativi binari sono stati testati con fingerprint generate dai metodi delle classi template std::map e std::vector. I risultati sui metodi più conosciuti di queste classi, come l’operatore[ ] della classe map e il metodo push_back della classe vector, mostrano una precisione che si aggira intorno al 20%.

Recognition of inlined binary functions from template classes

Binosi, Lorenzo
2019/2020

Abstract

Software reverse engineering is a complex process aimed to recover design and implementation information of the software under analysis. It is a very time-consuming activity that requires experience, knowledge of the underlying platforms, and tools that help reverse engineers in the static and dynamic analysis process. Compiler optimizations and code obfuscation make this process much harder for the reverse engineer and the existing tools are not usually designed to deal with such aspects. This work proposes a static analysis framework that helps the reverse engineer in the task of binary function recognition. In particular, it aims to recognize inlined method calls of template classes through a binary fingerprinting and matching approach. Our fingerprint model captures lexical and syntactic features of an assembly function, along with its Control-Flow Graph structure. Through the use of fingerprints and (sub)graph isomorphism algorithms, we are able to recognize inlined method calls in a target binary application. Additionally, the proposed framework automates the fingerprints generation phase by parsing the source code of the template classes. We performed our experiments on a dataset of GitHub projects tagged as C++. Such projects have been compiled with several optimization levels that allow the compiler to inline function calls. The resulting binaries have been tested with fingerprints generated from the methods of the std::map and std::vector template classes. The results on the most known methods of these classes, like the operator[ ] of the map class and the push_back method of the vector class, show an accuracy that averages around 20%.
POLINO, MARIO
ING - Scuola di Ingegneria Industriale e dell'Informazione
28-apr-2021
2019/2020
Il software reverse engineering è un processo complesso volto a recuperare informazioni di progettazione e di implementazione del software sotto analisi. È un'attività molto dispendiosa in termini di tempo che richiede esperienza, conoscenza delle tecnologia utilizzata e strumenti che aiutano il reverse engineer nel processo di analisi statica e dinamica. Le ottimizzazioni del compilatore e l'offuscamento del codice rendono questo processo molto più difficile per il reverse engineer e gli strumenti esistenti di solito non sono progettati per affrontare tali aspetti. Questo lavoro propone un framework di analisi statica per aiutare il reverse engineer nel riconoscimento di funzioni binarie. In particolare, mira a riconoscere le chiamate ai metodi inlined di classi template attraverso un approccio di fingerprinting e corrispondenza binario. Il nostro modello di fingerprint cattura le caratteristiche lessicali e sintattiche di una funzione assembly, insieme alla sua struttura del grafico del flusso di controllo. Con l'utilizzo delle fingerprint e di algoritmi di isomorfismo di (sotto)grafi siamo in grado di riconoscere le chiamate ai metodi inlinate in una designata applicazione binaria. Inoltre, il framework proposto automatizza la fase di generazione delle fingerprint analizzando il codice sorgente delle classi template. Abbiamo eseguito i nostri esperimenti su progetti GitHub etichettati come C++.Tali progetti sono stati compilati con diversi livelli di ottimizzazione per consentire al compilatore di inlinare le chiamate a funzioni. I relativi binari sono stati testati con fingerprint generate dai metodi delle classi template std::map e std::vector. I risultati sui metodi più conosciuti di queste classi, come l’operatore[ ] della classe map e il metodo push_back della classe vector, mostrano una precisione che si aggira intorno al 20%.
File allegati
File Dimensione Formato  
Tesi_Lorenzo_Binosi.pdf

solo utenti autorizzati dal 01/04/2022

Descrizione: tesi di laurea magistrale
Dimensione 998.7 kB
Formato Adobe PDF
998.7 kB Adobe PDF   Visualizza/Apri

I documenti in POLITesi sono protetti da copyright e tutti i diritti sono riservati, salvo diversa indicazione.

Utilizza questo identificativo per citare o creare un link a questo documento: https://hdl.handle.net/10589/174104