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 |