venerdì 17 dicembre 2010

Password e disassemblatori

Vediamo oggi come disassemblare un programma e trovare le informazioni che ci interessano. Per lo scopo potremmo utilizzare un qualsiasi software commerciale ma per ovvie ragioni legali, decido di realizzare un piccolo programma in c. Quindi realizzeremo un programma in c che richieda una password e poi cercheremo di scoprire quest'utlima attraverso la via del reversing. Il sorgente del nostro programma sarà il seguente:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]){
char password[11]={"3fs8dr12JW"},pwd[11];
int i=0,comp=-1;
do{
printf("Per accedere al programma devi inserire una password:\n");
gets(pwd);
comp=strcmp(password,pwd);
if(comp==0){
printf("PASSWORD CORRETTA\n");
}else{
printf("PASSWORD SBAGLIATA\n");
}
i++;
}while(i<3 && comp!=0);
if(comp!=0)
printf("Password sbagliata per tre volte di seguito! Uscita forzata!");
else
printf("Accesso consentito!");
system("PAUSE");
return 0;
}

Il programma chiede una password per avviarsi che può essere sbagliata per massimo 3 volte dopodichè esce. Ora vediamo come ottenere la password di questo programma utilizzando un'altra strada. Innanzitutto abbiamo bisogno di uno strumento importantissimo: il debugger. Il debugger che utilizzerò in questo esempio è ollydbg. Apriamo questo programma e apriamo il nostro file eseguibile:

Come vedete siamo fermi sul cosidetto entry point (cioè da dove parte il programma) con indirizzo 00401220. Ora se scorriamo un pò più giu il nostro programma notiamo qualcosa di veramente interessante, infatti:

sulla riga con indirizzo 004012BA troviamo la nostra password salvata in chiaro. E quindi come avete visto abbiamo scoperto la password! Analizziamo innanzitutto qual è stata la negligenza del programmatore. In questo caso abbiamo salvato la password in chiaro in una variabile di nome password che altro non era che un vettore di char, ovviamente un programmatore serio non l'avrebbe mai fatto, perché tutte le variabili vengono salvate in una zona della memoria direttamente accessibile in fase d'esecuzione. Ovviamente questo piccolo articolo non è esaustivo e completo (anche perché manca una bella parte teorica, che ho volutamente scordato per farvi entrare nell'immediatezza del processo) perché si potrebbe parlare per ore sul cracking. Però è sconvolgente notare che una miriade di programmi rilasciati come trial seguono questa procedura e quindi è veramente facile individuare il seriale...a voi le belle cose...
Concludo postando due programmi uno uguale a quello che abbiamo visto e un altro un pò più difficile, aspetto che mi mandiate le password tramite email...vediamo chi ci riesce.... :D Ciao a tutti...

P.S.:
Per quanto riguarda il primo è del tutto simile a quello che abbiamo visto. Per il secondo per scoprire la password dovrete faticare un pò, dovete eseguire il programma attraverso ollydbg (tasto f9) ma priva dovete porre un breakpoint sul punto giusto. Un breakpoint altro non è che un interruzione del programma, attraverso esso potete vedere i valori delle variabili correnti e motlo di più...Per mettere un breakpoint posizionatevi su di un indirizzo (riga) e premete F2 vedrete che la parte sinistra si colora di rosso, questo sta ad indicare che avete messo un breakpoint e quando il programma arrivera su quel punto si metterà in pausa. Ecco i programmi:

Programma semplice

Programma un pò più difficile

2 commenti:

  1. Come sempre articoli molto interessanti e chiari. Sarebbe bello approfondire il debugger unix gdb. Lo usai un po' di tempo fa e mi pare che si disassemblava il codice attraverso il comando 'disas'. Se riesco a trovare un po' di tempo libero vorrei fare un articolo.
    Comunque complimenti Antò!

    RispondiElimina
  2. Grazie, gdb è un ottimo debugger ma non è paragonabile a olly o meglio per usare gdb devi essere davvero un guru!! Olly rende tutto più semplice e visualizza tutti i registri senza richiamarli da comando ogni volta e in più visualizza i caratteri ASCII, mentre con gdb devi avere l'occhio allenato per riconoscere carattere in esadecimale....
    Saluti...

    RispondiElimina