venerdì 10 settembre 2010

Reverse Engineering su sistemi Unix e Linux

Prendendo spunto da blacklight e darkjoker, vorrei parlarvi del reverse engineering di software o eseguibili su sistemi unix e linux. Per comprendere il reverse bisogna avere una minima conoscenza del C e dell'Assembly, per disassemblare un eseguibile sui sistemi unix/linux possiamo utilizzare gdb o objdump, passiamo alla pratica creiamo un programma in C che ci chiede di inserire la password corretta che abbiamo inserito nel codice, quindi dobbiamo tramite il reverse fargli riconoscere qualunque password che impostiamo modificando i registri jne effettuando l'eliminazione del salto condizionato direttamente sulla stringa che stampa al video "password corretta", per maggiori informazioni leggete il pdf reverse di blacklight o i crackme di darkjoker. Scriviamo e compiliamo il nostro programma, code:


#include   stdio.h
#include   string.h
main() {
char pwd[] = "prova";
char str[30];
printf ("Inserire la password: ");
scanf ("%s",str);
if (!strcmp(str,pwd))
printf ("Password corretta\n");
else
printf ("Password errata\n");
}   

compiliamo con gcc:

gcc vuln.c -o vuln

eseguiamo il programma:

GiacomoAspire5310:reverse giacomo$ ./vuln
Inserire la password: ciccio
Password errata
GiacomoAspire5310:reverse giacomo$ ./vuln
Inserire la password: prova
Password corretta
 
Per disassemblare il programma io ho utilizzato solo objdump, invece blacklight nella sua guida usa gdb, quello che ci interessa è di analizzare solo la main del programma per potere modificare la jne impostando al suo posto dei nop (0x90), diamo il comando:

GiacomoAspire5310:reverse giacomo$ objdump -D vuln | grep main
    1f0d:    e8 2c 00 00 00           call   1f3e <_main>
00001f3e <_main>:
    1f45:    e8 00 00 00 00           call   1f4a <_main+0xc>
    1f95:    75 10                    jne    1fa7 <_main+0x69>
    1fa5:    eb 0e                    jmp    1fb5 <_main+0x77>
    2016:    e0 8f                    loopne 1fa7 <_main+0x69>
    201a:    e0 8f                    loopne 1fab <_main+0x6d>

Adesso che abbiamo visto la stringa esadecimale della jne, apriamo il programma vuln con un editor esadecimale e andiamo a sostituire 75 10 con 90 90 (che sono i nop) salviamo e avviamo il nostro eseguibile:

GiacomoAspire5310:reverse giacomo$ ./vuln
Inserire la password: ciccio
Password corretta

come vedete adesso possiamo inserire qualsiasi password! Il reverse viene utilizzato per il crack di giochi,software o per modificare il comportamento di un eseguibile, ovviamente non è sempre cosi facile crackare un programma, questo è un semplice esempio che spiega le basi di come fare, per maggiori informazione o per fare un pò di pratica vi consiglio di dare un'occhiata alla sezione di CrackMe di darkjoker. :)


1 commento:

Anonimo ha detto...

my computer when l put it on charge and l coleggo
without the charger the battery lasts me 2 minutes
as ever.
i could help her in charge of information
technology

Posta un commento