syscalo linux cracking 1 - creare e distruggere
Pubblicato da syscalo il 14/05/2000
Livello base

Introduzione

Semplicissimo tutorial sul cracking in Linux: niente piu' niente meno ;-). Per fare questo semplice tutorial ho scritto un piccolo programma in C che andremo a crackare.
Il codice sorgente del programma e' presente all'interno del tutorial.

Programmi usati

Iniziamo

In questo tutorial crackiamo un programma mooolto semplice scritto per l'occasione, e poi ce ne possiamo tornare ognuno dalla propria ragazza ;-)
Ecco il codice sorgente:


// file linux_tut1.c

#include <stdio.h>
#define STR "\n\t|-\\Primo tutorial per linux by syscalo/-| \
\n\n\t\t->Introduzione ai tool<-\n\n"
#define BRAVO "\nSeriale corretto!\n"
#define MMM "Non ci siamo ;-p\n"

main (void)
{
 int i = 0;
 int prova = 0;
 char dato[10];

 printf (STR);
 printf ("\nVediamo se indovini: ");
 scanf ("%s", dato);
 for (i = 0; i < 10 && dato[i] != 0; i++)
  prova += dato[i];

 if (prova == 301)
  printf (BRAVO);
 else
  printf (MMM);
} 
Come potete ben vedere e' molto semplice e non fa altro che sommare il codice ascii dei caratteri del seriale inserito e il valore cosi' ottenuto deve essere uguale a 301 (che io ho ottenuto con il seriale rEv ;)
Per compilare il programma:
rev@rVm:~/tute1linux > gcc -o linux_tut1 linux_tut1.c

Passiamo a disassemblare:
rev@rVm:~/tute1linux > oob linux_tut1 > disassemblato

Ora andiamo a vedere cosa fa in esecuzione il programma:

rev@rVm:~/tute1linux > linux_tut1
|-\Primo tutorial per linux by syscalo/-|
-> Introduzione ai tool <-
Vediamo se indovini: xxx
Non ci siamo ;-p
rev@rVm:~/tute1linux >

Se il seriale e' sbagliato il programma visualizza il messaggio "Non ci siamo ;-p"! E allora perche' non cercarlo nel disassemblato? Prendete il vostro editor di testo preferito e fate una ricerca della stringa. Di seguito e' riportato solo la parte di codice che ci interessa:


80483c0 ( 90) 817df82d010000 cmpl $0x12d,-0x8(%ebp) (JU 8048390 )
80483c7 ( 97) 7517           jne (to 80483e0 )
80483c9 ( 99) 68c0840408     pushl $0x80484c0 (R ' Seriale corretto! ')
80483ce ( 9e) e8ddfeffff     call (to 80482b0 <_init+0x5c>)
80483d3 ( a3) 83c404         addl $0x4,%esp
80483d6 ( a6) eb15           jmp (to 80483ed )
80483d8 ( a8) 90             nop
80483d9 ( a9) 8db42600000000 leal 0x0(%esi,1),%esi
80483e0 ( b0) 68d4840408     pushl $0x80484d4 (JC 80483c7 ) (R 'Non ci siamo ;-p ')
80483e5 ( b5) e8c6feffff     call (to 80482b0 <_init+0x5c>)
80483ea ( ba) 83c404         addl $0x4,%esp
80483ed ( bd) 89ec           movl %ebp,%esp (JU 80483d6 )
80483ef ( bf) 5d             popl %ebp
80483f0 ( c0) c3             ret

Come (fin troppo ;-p) ben specificato nel disassemblato, l'istruzione all'indirizzo 80483e0 viene raggiunta tramite un salto condizionato presente all'indirizzo 80403c7.
Andiamo quindi a vedere cosa c'e' a questo indirizzo:


80483c0 ( 90) 817df82d010000 cmpl $0x12d,-0x8(%ebp) (JU 8048390 )
80483c7 ( 97) 7517           jne (to 80483e0 )

Casualmente ;-) c'e' una locazione di memoria il cui contenuto viene confrontato con il valore esadecimale 12D che, sempre casualmente ;-p, corrisponde al valore decimale 301.
Poi viene effettuato un salto se il valore nella locazione e' diverso da 301 e viene visualizzata la stringa "Non ci siamo ;-p".

Scendiamo un po' piu' in basso nel codice e vediamo che c'e':


80483c9 ( 99) 68c0840408     pushl $0x80484c0 (R ' Seriale corretto! ')
80483ce ( 9e) e8ddfeffff     call (to 80482b0 <_init+0x5c>)

Ecco qui una stringa molto interessante: "Seriale corretto!". Ora spero che se dico che basta noppare il jne all'indirizzo 80483c7 per fare in modo che il programma mostri sempre la stringa "Seriale corretto!", qualsiasi seriale inseriamo, nessuno mi chieda perche' ;-p
Procediamo alla modifica vera e propria del programma: l'opcode delle istruzioni e' gia' presente nel disassemblato, quindi non ci resta che aprire il file con un editor esadecimale e modificare il 7517 in 9090.
Eseguiamo il tutto con biew:
rev@rVm:~/tute1linux > biew linux_tut1
Eccoci in biew; se non ci siete gia' andate in modalita' esadecimale (premere F2 e poi h).
Premete F5 (Goto), e premete F2 fino a selezionare Virtual e nel campo Type new shift: inserite l'indirizzo riportato nel disassemblato cioe' 80483c7 e premete invio.
Vi trovate proprio l'opcode 7517 della jne. Ma va?! 8-) Passiamo alla modifica:
premete F4 (Modify) e scrivete 9090 al posto di 7517. Ora premete F2 (Update) per salvare i cambiamenti (nel caso invece non voleste salvarli premete F10 (Quit)).
Il cracking del programma e' terminato!

Proviamo la nostra modifica:

rev@rVm:~/tute1linux > linux_tut1
|-\Primo tutorial per linux by syscalo/-|
-> Introduzione ai tool <-
Vediamo se indovini: certo!
Seriale corretto!
rev@rVm:~/tute1linux >

Volendo possiamo anche andare a vedere il disassemblato del programma dopo la modifica:
rev@rVm:~/tute1linux > oob linux_tut1 > disassemblato_modificato
-|-| disassemblato della parte modificata |-|-


80483c0 ( 90) 817df82d010000 cmpl $0x12d,-0x8(%ebp) (JU 8048390 )
80483c7 ( 97) 90             nop
80483c8 ( 98) 90             nop
80483c9 ( 99) 68c0840408     pushl $0x80484c0 (R ' Seriale corretto! ')
80483ce ( 9e) e8ddfeffff     call (to 80482b0 <_init+0x5c>)

Ed ecco le due nop al posto del salto ;-)

Conclusioni

Per il momento questo primo approccio puo' bastare! In fondo in ambiente windows si trovano spesso protezioni che si possono fregare semplicemente modificando un salto... e allora perche' non partire proprio con un esempio di questo tipo ;-)