Paolo PeregoFollowSpecialista di sicurezza applicativa e certificato OSCE e OSCP, amo spaccare e ricostruire il codice in maniera sicura. Sono cintura nera di taekwon-do, marito e papà. Ranger Caotico Neutrale, scrivo su @codiceinsicuro.
Offuschiamo il bytecode Java per divertimento: prima parte
Se non sapevate che il bytecode Java, quello che c’è nei vostri file .class è
semplice da mettere in chiaro, bhé allora sapevatelo ora: è semplice da
disassemblare.
Se volete proteggere i vostri file .class, dovete usare un tool di
obfuscation, ad esempio proguard, oppure
rivolgervi a strumenti commerciali.
In questo post faremo un offuscamento del codice molto leggero, andremo a
rinominare metodi, attributi della classe originale, che rinomineremo essa
stessa. Andremo inoltre ad iniettare del codice dummy all’interno del nostro
sorgente da proteggere.
Quello che voglio ottenere è un secondo file ,class, avente lo stesso
comportamento della classe di partenza, ma dall’aspetto interiore completamente
diverso.
Deve essere chiaro che la tecnica di renaming e di code injection, alza
l’asticella per scremare gli script kiddies. Puoi alzare l’asticella quanto
vuoi, andando ad iniettare più codice, ma un reverser vero impiegherà solo
più tempo a capire cosa fa la tua classe. L’obiettivo è rendere questo
processo non vantaggioso in termini di effort.
La vittima
Il file che vogliamo procedere è la pià classica delle classi. Un main, che
chiama un metodo che restituisce la stringa “Hello Wordl!” e che rende la
nostra giornata migliore, dopo aver visto il nostro interprete java, salutarci
calorosamente.
Il codice della classe HelloWorld, è il seguente:
Una volta compilato, il codice si presenta così:
Usando il disassembler, fornito dal JDK, abbiamo già un bel po’ di
informazioni:
A questo punto, anche un reverser, non troppo esperto può capire da cosa è
composto questo codice, cosa fa e mettere in chiaro il grande segreto dietro il
metodo sayHello().
Mescolatina di carte
Il nostro aiutante di oggi è javassist, una
libreria per la manipolazione dei file .class. L’ho scoperta mentre facevo un
po’ di scouting per il progetto Owasp
Orizon.
Ho pensato mi potesse venire utile, sia per fare introspezione dei metodi, sia
per giocare un po’ a guardia e ladri con il byecode java.
Primo obiettivo è modificare il metodo sayHello() che contiene tutta la
nostra logica applicativa.
Per prima cosa, devo andare a caricare la classe java che voglio modificare.
Deve essere nel mio class path, quindi devo ricordarmi di includere il ‘.’ al
parametro ‘-cp’ quando andrò ad eseguire il mio offuscatore. Pena, una
ClassNotFoundException.
javassist mi aiuta in questo e mi permette di andare a recuperare, tra i metodi
dichiarati nella classe, il metodo che voglio modificare, sayHello, nel mio
caso.
Una volta recuperato il metodo, mi diverto a giocarci un po’. Cambio il nome
usando un uuid
ed aggiungo in testa ed in coda al metodo un po’ di codice.
Se prestate attenzione, ho aggiunto del codice che non fa assolutamente niente.
L’unico mio scopo è quello di rendere più grosso il metodo sayHello().
Non contento, aggiungo alla classe un attributo ed un paio di metodi connessi
tra di loro e connessi al codice iniettato nel metodo sayHello() originale.
Questo punto è importante, altrimenti il compilatore, cercando di ottimizzare,
avrebbe tolto il codice non necessario.
L’ultima riga, crea un file .class, contenente le nostre modifiche in una
directory output. Il file ottenuto ha lo stesso comportamento del file di
partenza, pesa il triplo ed ha al suo interno nomi non parlanti e codice
completamente inutile.
Javap lo vede in questo modo:
Off by one
Chiaramente, quello presentato in questo esempio, non è un vero offuscatore
di codice. Però implementa i primi stage dell’arte dell offuscamento.
Da qui possiamo iniziare un viaggio, nel creare confusione ed entropia nel
nostro bytecode per rendere, si spera il più possibile non conveniente farne il
reverse.
Simili a "Offuschiamo il bytecode Java per divertimento: prima parte"
Se questo post ti è piaciuto, sono abbastanza sicuro che troverai questi contenuti altrettanto interessanti. Buona lettura.
Episodio 32: Quando l'EDR fa crock
Introduzione
Ciao caro lettore. Ero come al solito in ritardo nella creazione di questo
numero della newsletter di cybersecurity più aperiodica dell’universo, quando
Internet si è rotta ancora.
Eh già… in questi mesi ho dato anima e corpo al canale YouTube ed ho trascurato un po’ il mio blog. Questa però è una delle cose che voglio prima raccontare qui, nella mia versione digitale di un Bullet Journal.