Simple Science

Scienza all'avanguardia spiegata semplicemente

# Informatica# Crittografia e sicurezza

Progressi nella Disassemblaggio di Software Offuscato

Un nuovo metodo unisce LLM e tecniche tradizionali di smontaggio per un'analisi efficace.

― 5 leggere min


Smontaggio: Un NuovoSmontaggio: Un NuovoVantaggiofa avanzare le tecniche di smontaggio.Unire i LLM con i metodi tradizionali
Indice

La disassemblaggio è il processo che trasforma il codice macchina (che i computer capiscono) in linguaggio assembly (che gli esseri umani possono leggere). È fondamentale per analizzare come funziona il software, specialmente quando si cercano problemi di sicurezza. Tuttavia, alcuni software rendono questo processo difficile nascondendo il codice con byte spazzatura, che rovinano il modo in cui avviene il disassemblaggio. Anche se ci sono alcuni modi per affrontare questo, molte soluzioni non funzionano abbastanza bene. Qui entrano in gioco i modelli di linguaggio di grandi dimensioni (LLM).

La Necessità del Disassemblaggio

Il disassemblaggio è vitale per l'ingegneria inversa dei binari (che sono le versioni compilate dei programmi). Ci permette di capire cosa fa il programma e di trovare problemi come vulnerabilità o codice malevolo. L'obiettivo principale del disassemblaggio è identificare accuratamente i confini delle istruzioni all'interno di un file Binario. Questo può essere piuttosto complicato perché:

  1. Mix di Codice e Dati: A volte, codice e dati si mescolano, rendendo difficile capire dove finisce uno e inizia l'altro.
  2. Istruzioni di Lunghezza Variabile: Lunghezze diverse delle istruzioni possono generare confusione su dove inizia o finisce un'istruzione.

Errori nell'identificazione di questi confini possono portare a problemi significativi, inclusa l'errata interpretazione di cosa dovrebbe fare il codice.

Tecniche di Offuscamento

Per ostacolare il disassemblaggio, gli sviluppatori software possono utilizzare tecniche di offuscamento. Queste tecniche includono:

  • Inserimento di Byte Spazzatura: Aggiungere byte casuali nel codice per confondere i disassemblatori.
  • Predicati Opachi: Queste sono condizioni che uno strumento di analisi non può facilmente comprendere, causando diramazioni nel codice che potrebbero non verificarsi durante l'esecuzione.
  • Appiattimento del Flusso di Controllo: Modificare la struttura del codice per renderlo difficile da seguire logicamente.

Questi metodi creano sfide significative per chiunque cerchi di fare ingegneria inversa sul software.

Approcci Attuali al Disassemblaggio

Le soluzioni di disassemblaggio esistenti possono basarsi su vari metodi come l'esecuzione simbolica, l'euristica o il machine learning. Tuttavia, spesso presentano limitazioni:

  • Esecuzione Simbolica: Questo è un metodo per analizzare i percorsi e i valori degli input attraverso il codice. Anche se è approfondito, può diventare troppo complesso per binari grandi.
  • Euristiche: Queste sono regole pratiche che possono funzionare in molte situazioni ma spesso si basano su schemi specifici che potrebbero non valere in tutti i casi.
  • Machine Learning: I recenti progressi mostrano promesse in questo campo, ma possono comunque avere difficoltà contro l'offuscamento complesso.

Anche se queste tecniche hanno i loro punti di forza, spesso non reggono quando si trovano di fronte a un forte offuscamento.

Il Nostro Approccio: Combinare l'Intuizione Umana con gli LLM

Per affrontare le sfide del disassemblaggio di eseguibili offuscati, proponiamo un nuovo metodo che combina algoritmi di disassemblaggio tradizionali con LLM. L'idea principale è imitare il modo in cui un ingegnere inverso esperto lavorerebbe.

Gli LLM, addestrati su grandi quantità di testo, possono comprendere bene il contesto e la struttura del linguaggio. Il nostro obiettivo è utilizzare questa capacità per identificare istruzioni assembly valide dal codice macchina decodificato.

La Struttura del Nostro Sistema

Il nostro sistema è composto da due componenti principali:

  1. Classificatore di Validità Basato su LLM: Questo decide se un'istruzione disassemblata è valida o meno.
  2. Strategia di Disassemblaggio: Questo è un piano che utilizza il classificatore di validità per eseguire il disassemblaggio in modo efficace.

Classificatore di Validità

Per addestrare il classificatore di validità, abbiamo utilizzato un approccio di addestramento specifico. Abbiamo raccolto esempi di istruzioni valide e non valide da binari compilati. Questo ha comportato il disassemblaggio di programmi utilizzando le nostre tecniche e la raccolta di dati sulla loro struttura.

Con questi dati, abbiamo addestrato un LLM a riconoscere schemi che indicano se un'istruzione decodificata era corretta o meno.

Strategia di Disassemblaggio

Quando otteniamo un binario offuscato, iniziamo a disassemblarlo utilizzando una combinazione di metodi lineari e ricorsivi.

  • Disassemblaggio Lineare: Questo guarda ciascuna istruzione una dopo l'altra, assumendo che le istruzioni seguano l'una dopo l'altra in modo continuo.
  • Disassemblaggio Ricorsivo: Questo approccio tiene conto delle istruzioni di diramazione, tentando di seguire i flussi di controllo.

Dopo aver ottenuto un disassemblaggio iniziale, controlliamo la validità di ciascuna istruzione utilizzando il nostro classificatore, apportando correzioni dove necessario.

Valutazione del Sistema

Abbiamo messo alla prova il nostro approccio contro vari binari pesantemente offuscati. I risultati mostrano che il nostro sistema supera altri strumenti di disassemblaggio leader disponibili, dimostrando la sua efficacia nel gestire eseguibili offuscati.

Sfide nel Disassemblaggio

Nonostante i nostri progressi, disassemblare binari offuscati è ancora una sfida a causa della presenza di confini di istruzione errati. Questi possono portare a assunzioni sbagliate su come funziona il programma, risultando in output di disassemblaggio imprecisi.

Inoltre, i metodi tradizionali non sfruttano sempre le intuizioni degli esperti umani, che spesso possono determinare se un'istruzione non si adatta alla struttura prevista. La nostra combinazione di comprensione simile a quella umana proveniente dagli LLM e strategie di disassemblaggio esistenti mira a superare questi ostacoli.

Conclusione

In sintesi, disassemblare eseguibili offuscati è una sfida complessa che i metodi tradizionali non hanno completamente scoperto. Integrando gli LLM nel processo di disassemblaggio, possiamo gestire meglio l'offuscamento, portando a risultati più accurati e affidabili. La combinazione di tecniche consolidate e machine learning all'avanguardia offre una strada promettente in questo campo dell'analisi del software.

Man mano che continuiamo a migliorare i nostri metodi e a rifinire i nostri approcci, crediamo ci sia un grande potenziale per ulteriori avanzamenti nel modo in cui affrontiamo il problema dell'offuscamento nel disassemblaggio.

Fonte originale

Titolo: Disassembling Obfuscated Executables with LLM

Estratto: Disassembly is a challenging task, particularly for obfuscated executables containing junk bytes, which is designed to induce disassembly errors. Existing solutions rely on heuristics or leverage machine learning techniques, but only achieve limited successes. Fundamentally, such obfuscation cannot be defeated without in-depth understanding of the binary executable's semantics, which is made possible by the emergence of large language models (LLMs). In this paper, we present DisasLLM, a novel LLM-driven dissembler to overcome the challenge in analyzing obfuscated executables. DisasLLM consists of two components: an LLM-based classifier that determines whether an instruction in an assembly code snippet is correctly decoded, and a disassembly strategy that leverages this model to disassemble obfuscated executables end-to-end. We evaluated DisasLLM on a set of heavily obfuscated executables, which is shown to significantly outperform other state-of-the-art disassembly solutions.

Autori: Huanyao Rong, Yue Duan, Hang Zhang, XiaoFeng Wang, Hongbo Chen, Shengchen Duan, Shen Wang

Ultimo aggiornamento: 2024-07-11 00:00:00

Lingua: English

URL di origine: https://arxiv.org/abs/2407.08924

Fonte PDF: https://arxiv.org/pdf/2407.08924

Licenza: https://creativecommons.org/licenses/by/4.0/

Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.

Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.

Altro dagli autori

Articoli simili