Saturday, February 13, 2010

Cracking for fun

Reverse Engineering

In informatica significa "aprire" un programma, mettendo a nudo il suo codice assembler.

Il seguente esempio è riproducibile sia con Linux che con Windows.
Per Windows è necessario scaricare da MinGW gli elementi essenziali che dovrebbero essere presenti in ogni computer (i famosi build-essential di linux): gcc, gdb e make.

Userò gdb, il GNU debugger, per disassemblare l'esempio.

Normalmente non si dovrebbe conoscere il sorgente del programma da craccare, ma questa volta è un eccezione:

 /*password.c*/
#include <stdio.h>
#include <string.h>
int main() { 
    int ok;
    char pwd[20];
    printf("Per accedere inserire la password:\t");
    scanf("%s", pwd);
    ok = strcmp(pwd, "ciaociao");
    if(!ok){
        printf("\nLogin effettuato, benvenuto ADMIN\n");
        return;
    }
    printf("\nPassword Errata\n"); 
}

Quindi per potere accedere è necessario conoscere la password. Ma noi abbiamo accesso ai file binari del programma, quindi con un po' di reversing possiamo bypassare il controllo, ovvero cercare l'istruzione if ed eliminarla.

Dopo aver compilato il programma (ggc -o password password.c) proviamo a lanciarlo. Senza sapere la password non potremo mai accedere.
 Allora lanciamo gdb sul binario(da shell o da cmd, digitare gdb) e dissasembliamo il main:

$ gdb password         |||  per windows:    >gdb password.exe
(gdb)disassem main

Comparirà il main in "versione" linguaggio assembler.
Si osserva che qui

    0x00401327 <main+87>:   call   0x401b60 <strcmp>

è dove viene chiamata la strcmp che confronta la pwd inserita. Quindi più avanti ci deve essere l'if. Ed infatti:

    0x00401333 <main+99>:   jne    0x401343 <main+115>

C'è il salto condizionato che avviene se la pwd è sbagliata.
Stampando il contenuto della memoria (l'istruzione occupa 2 byte, lo si nota confrontando l'indirizzo della jne con quello dell'istruzione successiva), con l'istruzione
-x/2xb main+99
otteniamo il codice macchina dell'istruzione jne: (es su windows: 0x75 0x0e)
Ora aprendo con l'editor esadecimale il programma e cercando |75||0e| si può sostituire questa istruzione con due NOP (0x90) quindi le due celle saranno |90||90|. Salviamo il programma ed ora che abbiamo eliminato il controllo, qualunque password noi inseriamo l'accesso ci sarà consentito!

Cracking for fun!

No comments: