In this thesis, we address three problems concerning the static analysis of executable files: the identification of the Instruction Set Architecture (ISA), the discovery of the boundaries of the code section, and the problem of separating code from data. To disassemble an executable, we need to know its ISA and the boundaries of the code section; however, this information is not always available. We present a classification method to identify the ISA of header-less executable files and a sequential learning method to locate the boundaries of its code section. We test the architecture classifier on a dataset of binaries of 20 different ISAs: the experiments show that our method has a better performance than the state of the art. We test the code section identification method on ELF, PE and Mach-O executables compiled for different sets of architectures, by multiple compilers: the experiments show that our model is always able to identify, with a high accuracy, where the code is located inside the binary files. Data embedded inside the code section represents a major problem for disassemblers, which may interpret it as valid machine instructions. In literature, most of the proposed approaches to deal with inline data are based on recursive traversal disassembly, which presents severe limitations when dealing with indirect control instructions. We follow a different approach: we train a sequential learning classifier on the bytes representing code and data in pre-tagged executables, and use it to predict the boundaries of the instructions in unseen binaries. The results of our experiments show that our method is capable to distinguish code from data in unseen binary samples with an accuracy of over 99.9%.

In questa tesi, affronteremo tre problemi riguardanti l'analisi statica degli eseguibili: l'identificazione dell'Instruction Set Architecture (ISA), l'identificazione della sezione di codice, e la separazione codice-dati. Per poter disassemblare un file eseguibile, è necessario conoscerne l'ISA e la posizione della sezione contenente il codice. Come si procede se queste informazioni non sono disponibili? Presentiamo un semplice metodo di apprendimento supervisionato per identificare l'architettura dei file eseguibili e un metodo di apprendimento sequenziale per il riconoscimento dei confini della sezione codice nei binari privi di intestazione. Le prestazioni del nostro classificatore di architetture — valutato su più dataset derivanti da programmi reali e articoli scientifici — superano quelle dell'approccio allo stato dell'arte. Valutiamo il metodo di riconoscimento della sezione di codice su eseguibili ELF, PE e Mach-O compilati per più architetture, da diversi compilatori: il nostro modello è sempre in grado di identificare i byte appartenenti alle sezioni di codice con un'accuratezza elevata (99.8%). Nell'ambito dell'analisi statica degli eseguibili, i dati inseriti all'interno della sezione di codice da alcuni compilatori rappresentano un problema per i disassembler, che rischiano di interpretarli come istruzioni macchina. In letteratura, la gran parte degli approcci proposti per riconoscere i dati inline si basa sul disassembly ricorsivo, che presenta limiti significativi in presenza di salti indiretti. Seguiamo qui un diverso approccio: costruiamo un classificatore sequenziale che apprenda un modello probabilistico dei byte che compongono le istruzioni di codice macchina e i dati, in modo da poterli distinguere. I risultati degli esperimenti mostrano che il metodo presentato è in grado di distinguere il codice dai dati nei binari con un'accuratezza di oltre il 99.9%.

Supervised learning approaches to assist the static analysis of executable files

DE NICOLAO, PIETRO
2016/2017

Abstract

In this thesis, we address three problems concerning the static analysis of executable files: the identification of the Instruction Set Architecture (ISA), the discovery of the boundaries of the code section, and the problem of separating code from data. To disassemble an executable, we need to know its ISA and the boundaries of the code section; however, this information is not always available. We present a classification method to identify the ISA of header-less executable files and a sequential learning method to locate the boundaries of its code section. We test the architecture classifier on a dataset of binaries of 20 different ISAs: the experiments show that our method has a better performance than the state of the art. We test the code section identification method on ELF, PE and Mach-O executables compiled for different sets of architectures, by multiple compilers: the experiments show that our model is always able to identify, with a high accuracy, where the code is located inside the binary files. Data embedded inside the code section represents a major problem for disassemblers, which may interpret it as valid machine instructions. In literature, most of the proposed approaches to deal with inline data are based on recursive traversal disassembly, which presents severe limitations when dealing with indirect control instructions. We follow a different approach: we train a sequential learning classifier on the bytes representing code and data in pre-tagged executables, and use it to predict the boundaries of the instructions in unseen binaries. The results of our experiments show that our method is capable to distinguish code from data in unseen binary samples with an accuracy of over 99.9%.
QUARTA, DAVIDE
ING - Scuola di Ingegneria Industriale e dell'Informazione
3-ott-2017
2016/2017
In questa tesi, affronteremo tre problemi riguardanti l'analisi statica degli eseguibili: l'identificazione dell'Instruction Set Architecture (ISA), l'identificazione della sezione di codice, e la separazione codice-dati. Per poter disassemblare un file eseguibile, è necessario conoscerne l'ISA e la posizione della sezione contenente il codice. Come si procede se queste informazioni non sono disponibili? Presentiamo un semplice metodo di apprendimento supervisionato per identificare l'architettura dei file eseguibili e un metodo di apprendimento sequenziale per il riconoscimento dei confini della sezione codice nei binari privi di intestazione. Le prestazioni del nostro classificatore di architetture — valutato su più dataset derivanti da programmi reali e articoli scientifici — superano quelle dell'approccio allo stato dell'arte. Valutiamo il metodo di riconoscimento della sezione di codice su eseguibili ELF, PE e Mach-O compilati per più architetture, da diversi compilatori: il nostro modello è sempre in grado di identificare i byte appartenenti alle sezioni di codice con un'accuratezza elevata (99.8%). Nell'ambito dell'analisi statica degli eseguibili, i dati inseriti all'interno della sezione di codice da alcuni compilatori rappresentano un problema per i disassembler, che rischiano di interpretarli come istruzioni macchina. In letteratura, la gran parte degli approcci proposti per riconoscere i dati inline si basa sul disassembly ricorsivo, che presenta limiti significativi in presenza di salti indiretti. Seguiamo qui un diverso approccio: costruiamo un classificatore sequenziale che apprenda un modello probabilistico dei byte che compongono le istruzioni di codice macchina e i dati, in modo da poterli distinguere. I risultati degli esperimenti mostrano che il metodo presentato è in grado di distinguere il codice dai dati nei binari con un'accuratezza di oltre il 99.9%.
Tesi di laurea Magistrale
File allegati
File Dimensione Formato  
2017_10_DeNicolao.pdf

accessibile in internet per tutti

Descrizione: Testo della tesi
Dimensione 1.93 MB
Formato Adobe PDF
1.93 MB 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/135988