La mutazione |
||
22/06/2000 |
by "syscalo" |
|
|
Published by Quequero |
|
| Reversing? | Menomale che c'è sys a portare avanti questa mitica sezione, bravissimo sys, ottimo tute, ti invito la prossima volta a fare un tute sull'uso di questi mitici tools per linux :) |
...cracking for today! |
| UIC's form |
|
UIC's form |
Difficoltà |
( )NewBies (×)Intermedio ( )Avanzato ( )Master |
Ho intitolato questo tutorial "La mutazione" perche', non essendo il
programma registrabile in alcun modo, l'unica cosa da fare per poterlo usare come
registrato e' modificarlo e per fare le cose bene lo modifichiamo anche nell'aspetto!!
(unshareware version)
Written by syscalo
Introduzione |
Tools usati |
dasm (disassemblatore, lo potete trovare su freshmeat)
biew (editor esadecimale, lo potete trovare su freshmeat)
gdb (debugger, presente in ogni distribuzione di Linux)
URL o FTP del programma |
Notizie sul programma |
Essay |
Per organizzare meglio il lavoro lo divido in diversi passi in modo da rendere tutto
piu' chiaro.
Preliminari: disassemblate il file Coffee con il dasm.
Passo 1:
Eliminare la limitazione del tempo massimo di 30 giorni e msgbox
iniziale.
Se andate a sbirciare un po' tra la symbol table nel disassemblato del programma troverete
una simpatica funzione che i programmatori hanno pensato bene di chiamare time_limit. Ora
spero che questo nome sia abbastanza significativo per chiunque stia leggendo questo
tutorial!
La prima cosa che si potrebbe fare e' andare a vedere cosa fa questa funzione; io l'ho
fatto, ma con l'intento di prendere un po' di familiarita' con la sintassi AT&T. Pero'
se ragionate un attimo, il programma, non essendo registrabile, non saltera' mai la
chiamata a questa procedura e quindi basta noppare la chiamata; per nostra fortuna il
programma funziona proprio cosi' e in realta' siamo ancora piu' fortunati perche' la
visualizzazione della msgbox che mostra i giorni restanti viene effettuata dentro la
procedura time_limit e quindi in un colpo solo eliminiamo due problemi.
Procediamo:
nel disassemblato cercate la funzione time_limit, e troverete queste scritte:
<time_limit>
806d9e0 ( 0)
55 pushl
%ebp
(CL 806dd3e <main+1d2>) <-- questa scritta sta ad
indicare che la funzione viene chiamata dalla call all'indirizzo 806dd3e nel main
806d9e1 ( 1) 89e5
movl %esp,%ebp
quindi rechiamoci a questo indirizzo nel main:
806dd3e (1d2) e89dfcffff
call
(to 806d9e0 <time_limit>)
ora aprite il file Coffee con il biew, andate in visualizzazione esadecimale, portatevi all'indirizzo virtuale 806dd3e e sostituite l'opcode e89dfcffff con 9090909090 in modo da noppare la chiamata. Salvate le modifiche e provate ad eseguire il programma. Niente piu' giorni rimanenti, ne msg box ;-)
E fin qui la cosa e' banale, grazie soprattutto all'ingenuita' dei programmatori! Ma proseguiamo
Passo 2:
Non mostrare la seconda msgbox di chiusura che invita a registrarsi
e terminare correttamente il programma.
Quando vogliamo chiudere il programma viene visualizzata prima la msgbox con titolo Exit e
con i pulsanti Exit, Save All e Cancel. Per uscire ovviamente dobbiamo premere il pulsante
Exit, ma sorpresa.... una seconda msgbox compare e ci invita a registrarci. Se premete il
tasto Ok il programma termina e basta, mentre se si preme il tasto Cool il programma
lancia il browser preferito cercando di collegarsi al sito del programma.
Ora io ho pensato questo: se si collega al sito, deve per forza passare in qualche modo
l'indirizzo del sito e allora via con la ricerca nel disassemblato della stringa
www.coffeecup.com.
Ne troverete alcune prima di arrivare a quella giusta, ma e' facilmente intuibile quale e'
quella giusta, con due semplici accorgimenti:
bene, questa e' quella giusta, ed ora possiamo lavorarci un po': anche il nome ispira
molto "see_us" :-)
Ora io qui ho usato il gdb per vedere un po' il funzionamento del programma (e per
imparare ad usare un po' il gdb ;) ma non e' necessario, si puo' risolvere tutto con
l'approccio passivo lavorando sul disassemblato.
Ok, cerchiamo nel disassemblato la funzione CB_msgbox_s0:
<CB_msgbox_s0>
806eb88 ( )
55 pushl %ebp
806eb89 ( 1) 89e5 movl
%esp,%ebp
806eb8b ( 3) e89c2d0100
call
(to 808192c <see_us>) <--chiama la procedura see_us
806eb90 ( 8) 6a00 pushl $0x0
806eb92 ( a) e86986ffff
call
(to 8067200 <_init+0xe70>) <--chiama la procedura exit
806eb97 ( f) 90 nop
Per sapere che _init+0xe70 e' la funzione exit cercate
nel disassemblato la stringa 8067200 e troverete:
8067200 F *UND*
c8
exit@@GLIBC_2.0
Appena terminata la procedura CB_msgbox_s0, trovate la procedura CB_msgbox_s1 e la
procedura msgbox_s.
La procedura CB_msgbox_s1 e' quella che viene chiamata quando nella seconda msgbox
premiamo Ok ed e' la seguente:
<CB_msgbox_s1>
806eb98 ( )
55 pushl %ebp
806eb99 ( 1) 89e5
movl %esp,%ebp <--come
vedete qui non chiama la procedura see_us
806eb9b ( 3) 6a00 pushl
$0x0
806eb9d ( 5) e85e86ffff
call
(to 8067200 <_init+0xe70>) <--chiama la procedura exit
806eba2 ( a) 89f6
movl %esi,%esi
Come potete vedere dalle seguenti righe:
<msgbox_s>
806eba4 ( )
55 pushl
%ebp
(CL 807445b <CB_exit_ok+27>)
Per sapere quali sono le funzioni, cercare sempre nel
disassemblato gli indirizzi indicati:
8066fb0 F
*UND*
29
printf@@GLIBC_2.0
8066910 w F
*UND*
25f system@@GLIBC_2.0
La mia idea e' stata questa: invece di effettuare la chiamata a
msgbox_s potremmo modificare le istruzioni per far chiamare la procedura CB_msgbox_s1 in
modo da terminare correttamente il programma senza visualizzare la seconda msgbox che ci
invita a registrarci; e visto che l'idea mi e' sembrata buona l'ho fatto ;-)
Dobbiamo quindi inserire l'istruzione "call CB_msgbox_s1"
e noppare tutto cio' che non ci serve. Il problema e' come trovare l'opcode della call da
inserire.
Ecco il metodo:
Iniziamo a noppare cio' che non ci serve, quindi le istruzioni ai
seguenti indirizzi:
8074456 e da 8074460 a 8074462
in sostanza lasciamo la call e le istruzioni prima della push
all'indirizzo 8074456.
Passiamo a generare l'opcode per la call:
innanzi tutto ragioniamo (ovviamente) sugli indirizzi e non sulla
etichette: quindi la nostra istruzione sara' "call 806eb98"
noi siamo all'indirizzo 807445b, quindi effettuiamo la seguente
operazione: indirizzo a cui dobbiamo saltare (806eb98)- indirizzo dell'istruzione
successiva alla call (8074460)=ffffa738
Ora possiamo generare l'opcode:
e8: call
ffffa738: offset a cui saltare
i byte dell'offset vanno inseriti al contrario, e si ha l'opcode:
e838a7ffff
Ecco fatto! Aprite il file Coffee con biew, andate all'indirizzo
virtuale 807445b e sostituite l'opcode calcolato (e838a7ffff) a quello gia' presente
(e844a7ffff) e poi noppate le istruzioni indicate prima sostituendo 90 ai loro opcode.
Salvate le modifiche, e chiudete biew; avviate Coffee, Control-x per
terminare il programma: compare la prima msgbox Exit; premete il pulsante Exit e il
programma termina correttamente senza visualizzare piu' la seconda msgbox che invita a
registrarsi.
Passo 3:
Eliminare l'immagine gialla SHAREWARE - PLEASE
REGISTER.
Un metodo semplice e' cercare l'immagine nel file ed
"eliminarla" azzerando il primo byte del'immagine stessa.
Grazie alla bonta' dei programmatori, sbirciate sempre un po' nella
symbol table e troverete la label share_xpm:
8234cb4 l O
.data
37c
share_xpm
Bene, aprite il file Coffee con biew, andate all'indirizzo virtuale
8234cb4 e sostituite il primo byte con 0; salvate le modifiche e avviate Coffee.
L'immagine non c'e' piu', ma ci sono due problemi:
Per ovviare al primo problema e' sufficiente analizzare la funzione see_us:
<see_us>
808192c ( )
55 pushl
%ebp
(CL 806eb6f <CB_register_ok+3>) (CL 806eb8b <CB_msgbox_s0+3>)
808192d ( 1)
89e5 movl %esp,%ebp
808192f ( 3) 6800102608 pushl $0x8261000
8081934 ( 8)
e82fd8feff call
(to 806f168 <check_bin>)
8081939 ( d) 83c404 addl
$0x4,%esp
808193c ( 10) 83f8ff cmpl
$-0x1,%eax
808193f ( 13)
741e je
(to 808195f <see_us+0x33>) <-- non so per quale motivo, ma
i programmatori hanno inserito questo salto condizionato che salta completamente la
chiamata all'attivazione del browser! Quindi sfruttiamolo con piacere ;-)
8081941 ( 15) 6800102608 pushl $0x8261000
8081946 ( 1a) 6860662008 pushl
$0x8206660 (R '%s
"http://www.coffeecup.com" &')
808194b ( 1f) 6820332408 pushl $0x8243320
8081950 ( 24)
e8ab5afeff call
(to 8067400 <_init+0x1070>)
8081955 ( 29) 6820332408 pushl $0x8243320
808195a ( 2e)
e825feffff call
(to 8081784 <run_program>)
808195f ( 33)
c9 leave
(JC 808193f <see_us+13>)
8081960 ( 34)
c3 ret
Modifichiamo il salto in un jmp cambiando l'opcode dell'istruzione da 741E in EB1E; apportate le modifiche con biew al file Coffee e siete a posto: ora il programma e' quasi perfetto, tutte le possibilita' per avviare il browser a tentare di collegarsi al sito sono disinibite, compresi i pulsanti register!!
Rimane la seccatura del pulsante Register che si vede all'avvio del programma, e la
scritta **SHAREWARE VERSION! Please Register**.
Eliminiamo tutto lo splash screen che viene creato all'avvio e facciamo prima ;-)
Passo 4:
Eliminare lo splash screen creato all'avvio.
Ancora un volta i programmatori ci vengono in aiuto! Guardate i messaggi che vengono
scritti sulla console da cui avviate il programma; ecco l'output normale:
HTMLEDITOR: Starting version 4.1
Setting signals...
Setting locale...
Initializing GTK...
Initializing system colors...
Parsing configuration file...
Creating GUI...
Creating splash screen... <--ecco come i programmatori ci
vogliono bene ;-)
Done...
Cleaning up...
Cercate la stringa "Creating splash screen..." nel disassemblato e troverete
le seguenti istruzioni:
806dcc6 (15a) 6815551508 pushl
$0x8155515 (R 'Creating splash screen...')
<--le tre call seguenti sono tutte da noppare
806dccb (15f) e8e092ffff
call
(to 8066fb0 <_init+0xc20>) <--chiama la printf
806dcd0 (164) e85f7f0000
call
(to 8075c34 <init_texts>)
806dcd5 (169) e8dab70000
call
(to 80794b4 <init_page>)
806dcda (16e) 68a0032608 pushl $0x82603a0
Per risolvere velocemente il problema e' sufficiente noppare tutte 3 le call e il
programma partira' senza creare lo splash screen e senza visualizzare la scritta su
console.
Per una soluzione piu' "elegante" si potrebbe mettere all'indirizzo 806dcc6 una
istruzione di jmp all'indirizzo 806dcda; e allora facciamolo :-)
Sostituiamo l'opcode dell'istruzione all'indirizzo 806dcc6 con l'opcode, che ora ci
calcoliamo, della jmp:
jmp: EB
offset: 12
Opcode da sotituire EB12, che poi andremo a completare con 909090 per coprire lo stesso
numero di byte della pushl.
Andate in biew ed effettuate le modifiche; ora non c'e' piu' nemmeno lo splash screen
iniziale ;-)
Ok, credo che abbiamo finito!! Adesso il programma e' funzionante, privo di ogni schifezza che ci inviti a registrarlo... se i programmatori hanno scritto il programma bene come l'hanno protetto conviene cestinare il programma stesso.... ma fortunatamente spesso non e' cosi' ;-)
bye to all
syscalo
|
A lavorare su questo programma mi sono divertito e ho imparato anche alcune cose nuove.
I consigli che vi posso dare sono questi:
· provate ad usare il gdb e settare breakpoint sulle funzioni citate sopra e girare un
po' live tra il codice.
· leggetevi le pagine di info delle procedure che incontrate (ad es. info gtk e poi
andate nell'indice delle funzioni e cercate quella che vi interessa) perche' capirete
meglio cio' che sta facendo il programma
· ed infine provate a fare qlc voi, e sperimentate! E nel caso trovaste un buon approccio
alternativo al mio fatemelo sapere.
Per chi vuole esercitarsi suggerisco di provare a trovare la parte di programma che genera il panel contenente l'immagine gialla SHAREWARE - PLEASE REGISTER. Io l'ho fatto, ma non l'ho riportato qui per istigarvi a provare voi!
Un saluto a tutta la UIC, al chan #crack-it (anche se frequento pochissimo) e a tutti
coloro che si danno da fare nel mondo informatico, sia chi programma, sia chi programma
all'inverso ;-Þ
Per ultimo, ma solo per metterlo in risalto, un mega kiss a colei che rende stupenda ogni
mia giornata ;-))
Disclaimer |
Io non ho lavorato su questo programma per usarlo gratuitamente, altrimenti avrei tolto solo il time limit! L'ho fatto perche' per me e' stata una sfida a scoprire qlc di nuovo e spero lo sia anche per voi. Se il programma vi piace sganciate qualche soldo hai programmatori che cmq ci hanno dedicato un po' del loro tempo.
| UIC's page of reverse engineering, scegli dove andare: |
| Home Anonimato Assembly CrackMe ContactMe Forum Iscrizione |
| Lezioni Links Linux NewBies News Playstation |
| Tools Tutorial Search UIC Faq |
| UIC |