Fonte immagine: pixabay.com

Python è un linguaggio di alto livello. Sebbene molti di voi possano pensare che sia un linguaggio di programmazione, non lo è. È un linguaggio di scripting. Non arriva da nessuna parte vicino al codice macchina o al linguaggio macchina. Allora cos'è che rende Python così interessante? Se hai qualche esperienza nel pentesting o hai avuto una conversazione con molti esperti di sicurezza Web o analizzatori di malware, suggerirebbero sempre Python come lingua principale per sviluppare malware o exploit.

Mentre alcune persone potrebbero preferire C, C ++ o perl, voterei personalmente per Python. Il motivo è che non è solo utile come strumento per scrivere un programma, ma è anche utile per romperlo.

Che cos'è il reverse engineering?

Il reverse engineering è un concetto molto ampio. Non si può in realtà definirlo con semplici sintassi. Il corretto concetto di Reverse Engineering è quello di scomporre un codice in parti più semplici, comprenderlo, modificarlo e migliorarlo secondo i nostri scopi e quindi rimontarlo per adattarlo alle nostre esigenze. Per renderlo un po 'più semplice, lascia che ti dia alcuni esempi estremamente comuni.

Facciamo un esempio di un telefono cellulare Android. I produttori creano una ROM di scorta e vendono ai propri consumatori. Ma la maggior parte delle volte contiene molti bloatware e diventa in ritardo. Quindi, ci sono persone su siti web come XDA e androidcentral che si inoltrano nella ROM, la migliorano e la rendono a prova di ritardo. Un esempio pratico sarebbe CyanogenMod Rom.

Ma questo è stato solo un esempio per farti capire di cosa si tratta. Il reverse engineering ha lo stesso concetto, ma è troppo complicato rispetto alla semplice modifica di una ROM.

Compilazione e Python

Se hai esperienza in Python, sai che quando si scrive uno script Python, può essere un virus, payload, trojan o qualunque sia il file, funzionerà solo nei computer in cui è installato Python. Quindi, diciamo, ho scritto un eccellente trojan per computer che può bypassare qualsiasi antivirus e comincio a distribuirlo in un sistema Windows, ma se il sistema Windows non ha installato l'interprete Python, allora non funzionerà. Quindi, è necessario compilare ogni file dello script python scritto in un eseguibile e quindi distribuirlo nel sistema Windows.

Reverse Engineering eseguibili di Windows

Ora sai, che dobbiamo compilare gli script Python per essere eseguiti in Windows, devi anche sapere che deve esserci un compilatore, che converte gli script Python in un eseguibile. Si C'è. Si chiama Py2exe. Py2exe è un semplice programma di installazione che converte gli script Python in programmi Windows autonomi. Ora, c'è anche un altro strumento che converte gli eseguibili di Windows scritti in python in script python. Si chiama Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder è uno strumento per ricompilare / decodificare eseguibili generati da pyinstaller senza avere accesso al codice sorgente. Quando si avvia il file EXE, questo viene decompresso nella memoria. Ciò include i file .pyc (codice Python che viene convertito in bytecode). Fondamentalmente ciò che fanno strumenti come pyinstaller e py2exe sono librerie di pacchetti e dipendenze tutte insieme in modo da poter eseguire il file EXE 'autonomo' senza doverli scaricare o preparare la macchina con un interprete python.

C'è anche un altro toolkit che ti porta molto vicino al codice sorgente. Il nome è PyRetic che sta per Reverse Engineer Obfuscated Python Bytecode. Questo toolkit consente di riportare un oggetto in memoria al codice sorgente, senza bisogno di accedere al bytecode direttamente sul disco. Questo può essere utile se le applicazioni pyc su disco sono offuscate in uno dei molti modi.

Corsi consigliati

  • Formazione su Java Hibernate
  • Formazione sulla certificazione online in Java Spring
  • Programma WordPress
  • Formazione per la certificazione in Ruby

Ingegneria inversa Il modo più duro

Ora la parte sopra è facile da capire e praticamente lo fai quando hai almeno le conoscenze di base in Python. Ma non è sempre così. A volte, non hai alcuna documentazione o commento nello script di Python e ci sono anche molti file che puoi capire da solo. Ora c'è un libro fantastico su questa parte, ma non mi concentrerò molto su questo.

Il nome del libro è "Lavorare efficacemente con il codice legacy". Il libro è indipendente da Python o da qualsiasi altra lingua e ti darà un'idea per il reverse engineering in quasi tutte le lingue. L'obiettivo principale, quando si cerca di capire un pezzo di codice, è il motivo per cui si desidera capirlo.

Se si desidera decodificare il codice per modificarlo o portarlo, l'approccio per entrambi sarebbe piuttosto diverso. Quindi, la strumentazione del codice legacy, con batterie e impalcature di test e traccia / registrazione è il percorso cruciale sul lungo, duro slogan per comprendere e modificare in modo sicuro e responsabile.

Strumenti di ingegneria inversa

Ora c'è un altro metodo per renderlo un po 'facile che puoi seguire insieme a seguire i passaggi precedenti. C'è un sito chiamato come Epydoc. In questo sito, controllerà il codice e creerà della documentazione per esso. Il risultato non sarà buono come la documentazione originale, ma almeno ti darà un'idea di come funziona esattamente. In questo modo, puoi iniziare a scrivere la tua documentazione e, dopo aver parzialmente scritto il documento, puoi generare nuovamente il documento parziale rimanente dal sito per la parte rimanente.

Puoi persino usare lo strumento IDE per analizzare il codice. Questo in genere ti dà il completamento del codice, ma soprattutto in questo caso, rende possibile semplicemente fare clic tenendo premuto il tasto Ctrl su una variabile per vedere da dove proviene. Questo accelera davvero le cose quando vuoi capire il codice di altre persone.

Inoltre, devi imparare un debugger. Dovrai, in parti difficili del codice, esaminarli in un debugger per vedere cosa fa effettivamente il codice. Python pdb funziona, ma molti IDE hanno debugger integrati, che rendono più semplice il debug. PyReverse di Logilab e PyNSource di Andy Bulka sono utili anche per la generazione di diagrammi UML.

Esiste un processo per produrre il modello di classe UML da un determinato input di codice sorgente. Con questo, puoi invertire uno snapshot della tua base di codice in classi UML e formare ulteriormente il diagramma delle classi. Portando il contenuto del codice nel modello UML visivo, questo aiuta i programmatori o gli ingegneri del software a rivedere un'implementazione, identificare potenziali bug o carenze e cercare possibili miglioramenti.

A parte questo, gli sviluppatori possono invertire una libreria di codici come classi UML e costruire un modello con essi, come invertire un framework di raccolta generico e sviluppare il proprio framework estendendo quello generico. In questo capitolo, esamineremo il contrario istantaneo di Python.

Oggetti e primer

Per comprendere appieno il funzionamento interno di Python, si dovrebbe prima acquisire familiarità con il modo in cui Python compila ed esegue il codice. Quando il codice viene compilato in Python, il risultato è un oggetto codice. Un oggetto codice è immutabile e contiene tutte le informazioni necessarie all'interprete per eseguire il codice. Un'istruzione di codice byte è rappresentata come un valore di codice operativo di un byte seguito da argomenti quando richiesto. Si fa riferimento ai dati usando un indice in una delle altre proprietà dell'oggetto codice.

Una stringa di codice byte si presenta così:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

Il codice byte Python funziona su una pila di elementi. Un'estensione più intraprendente sarebbe quella di tentare di decompilare il codice byte in codice sorgente Python leggibile, completo di nomi di oggetti e funzioni. Il codice Python può essere distribuito in forma binaria utilizzando il modulo marshal. Questo modulo offre la possibilità di serializzare e deserializzare gli oggetti di codice utilizzando le funzioni store e load.

Il formato binario più comunemente riscontrato è un file Python compilato (.pyc) che contiene un numero magico, un timestamp e un oggetto serializzato. Questo tipo di file viene generalmente prodotto dall'interprete Python come cache dell'oggetto compilato per evitare di dover analizzare l'origine più volte. Queste tecniche si basano sulla facilità di accesso al codice byte e alle informazioni sul tipo.

Con il codice byte di un oggetto codice, la logica del codice può essere modificata o addirittura sostituita interamente. L'estrazione di informazioni sul tipo può aiutare nella comprensione del progetto del programma e nell'identificazione della funzione e degli scopi dell'oggetto.

L'offuscamento e l'indurimento del codice byte dell'applicazione sarà sempre una corsa tra gli implementatori e coloro che cercano di romperlo. Per tentare di difendersi dal recupero del codice byte, il primo passo logico è verso una soluzione di traduzione runtime.

Le proprietà di un oggetto codice possono essere archiviate in qualsiasi formato firmato, crittografato o altrimenti offuscato che viene offuscato o tradotto durante il runtime e utilizzato per creare un'istanza di un nuovo oggetto. Si potrebbe anche cambiare il modo in cui le ricerche di nomi di variabili funzionano all'interno dell'interprete per offuscare le informazioni di denominazione. Aggiungendo un livello di traduzione tra la ricerca dei nomi effettivi e i nomi all'interno del codice sorgente, uno sviluppatore potrebbe ulteriormente mitigare i tentativi di inversione.

Conclusione

Ora, dopo aver letto tutto ciò, potresti sentire il bisogno di andare e sperimentare alcuni dei pedaggi là fuori. Quindi, ecco alcuni strumenti che possono aiutarti a decodificare il tuo codice Python:

  1. Paimei
  1. Sulley
  1. La collezione Carrera
  1. PyEmu
  1. IDAPython
  1. ImmDbg

Tutti questi sono grandi pezzi di codice, ma ciò che li rende davvero eccezionali è quando vengono utilizzati insieme. Tieni presente che questo non è in alcun modo un elenco completo, solo quelli che utilizzo di più e penso dimostrino come la flessibilità di Python possa rendere gestibile un compito così complesso come il reverse engineering.

Articoli consigliati

Ecco alcuni articoli che ti aiuteranno a ottenere maggiori dettagli sull'ingegneria inversa con Python, quindi passa attraverso il link.

  1. 25 domande e risposte più interessanti su Python
  2. Inizia con Python e Django per lo sviluppo Web
  3. Quali sono i vantaggi e i limiti dell'utilizzo di Python?
  4. Carriere in Python
  5. Strumenti di ingegneria inversa

Categoria: