• Benvenuto in Making Videogames!
  • Condividi la tua passione!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati



Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Title: CrackMe
Modi discussione
#1
Con Viliteschi (spero di aver scritto bene il nome XD ) è uscita fuori una mezza discussione, alla fine ha detto che è capace di creare crack.
Così gli ho proposto un esercizio, solo a scopo informativo (legale): io gli faccio un programmino e lui prova a crackkarlo (passatemi il termine).

Se riesce a farlo potrebbe spiegarci (ripeto: solo a scopo informativo per vedere come funziona il reversing sui nostri programmini) come riesce a farlo.

Ecco il primo programmino (a dire il vero sarebbe il secondo), penso che si possa considerare abbastanza semplice (è più semplice del primo)
http://www.megaupload.com/?d=ZU4RGALZ
 
Reply
#2
steve il primo file che mi ai dato da scoprire password. pero ce un problema io sno abituato ad usare dede e Hiew726w.pero io lo facevo sun windows xp adesso su windows 7 mi da dei problemi quindi non lo posso scoprire per 30 minuti almeno 2 ore scusa

<assembly xmlns="urnConfusedchemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urnConfusedchemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>


[EDIT by Steve] Aggiungo il messaggio postato sull'altro topic


steve il primo file che mi ai dato da scoprire password ho scoperto come lo ai fatto ecco a te i codici
<assembly xmlns="urnConfusedchemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urnConfusedchemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
 
Reply
#3
E la password sarebbe?
Sei riuscito a saltare la parte di codice che richiede la password e far apparire il messaggio di conferma?

PS.
Ti ho cancellato il messaggio sull'altro thread, visto che era offtopic. Te lo riporto qui.
 
Reply
#4
Ma questo è l'assembly, quindi non hai craccato un bel nulla cosi XD.
 
Reply
#5
Eh si, pure a me sembra un codice xml che dice soltanto che il programma non richiede i privilegi di amministratore...
 
Reply
#6
cioè quindi se io ti passo un programma fatto da me in cui richiedo una password riesci a crackarlo ? allora spetta che te ne passo uno XD
 
Reply
#7
riddick ce qualcosa che non va e sto imaparando ad usare nuovi programmi. io usavo -- DeDe e Hiew726w pero Hiew726w non funziona DeDe non mi fa l analisi forse perche io lo usavo con xp sto cercando un nuovo programma scusate.
 
Reply
#8
usarlo in modalità compatibilità per xp o vista o quello che è ?
 
Reply
#9
Se volete un indizio avvisatemi...
 
Reply
#10
dovrebbbe essere: VediamoSeScopriteCosaHoScritto
pero' non pare funzionre
bho
Predator
 
Reply
#11
(15-07-2011, 05:37 PM)Predator Ha scritto: dovrebbbe essere: VediamoSeScopriteCosaHoScritto
pero' non pare funzionre
bho
Predator

Non funziona perché non è quella la password, è un po' meno scontata, però non sei fuori strada... ti manca giusto un passaggio e trovi la soluzione.

Fortuna che non ho cancellato il progetto, come mi è di pessima abitudine fare, altrimenti col piffero che mi ricordavo la soluzione XD

PS. benvenuto nella community Wink
 
Reply
#12
la password è 3051
LOL quando ho risposto dovevo essere davvero stanco Big Grin

PS: grazie del benvenuto Smile
(05-03-2011, 03:15 PM)Lorenz Ha scritto: cioè quindi se io ti passo un programma fatto da me in cui richiedo una password riesci a crackarlo ? allora spetta che te ne passo uno XD

Lorenz, magari pubblicalo nel forum cosi ci proviamo tutti Smile
 
Reply
#13
Umhhh penso di non averlo più...ma non ci metto tanto a crearti un programma in vb.net che richiede la pass
 
Reply
#14
vbnet, c#, vc++, asm, delphi vedi tu Smile
a seconda del linguaggio utilizzato il codice nell'exe è notevolmente diverso, occorre sapere il comportamento di reversing di tutti i linguaggi.
magari fai un programma con gui e non una triste applicazione console Big Grin
 
Reply
#15
vb.net e c# lo posso fare gli altri non li conosco tanto xD intanto ne faccio uno base, magari quando un olo risolve mi manda un PM Smile
 
Reply
#16
Prova con questo: http://www.megaupload.com/?d=MA1HYDWS
Non so quanto si possa ritenere più difficile rispetto il primo... se mi dai qualche dritta su cosa rende il lavoro difficile a un reverser posso provare a farne uno un po' più difficile.

Il prossimo provo a farlo con gui.
 
Reply
#17
eccolo! l'ho scaricato e mi par di aver capito che il programma confronta l'MD5 delle stringa inserita, pertanto se questo è corretto ci sono solo due modi per superare questo crackme: decriptare l'hash d8bd309f095c7fdd320d0f30ae2ae788, oppure patcharlo

Predator
 
Reply
#18
L'MD5 viene calcolato in runtime, quindi (premetto che non so niente di reversing) credo che sia possibile trovare la password senza patch e senza decriptare.
Correggetemi se sbaglio...
 
Reply
#19
se l'md5 viene calcolato a runtime si, pensavo fosse preinputato.
intanto linko il crackme crakkato
http://www.mediafire.com/?529ruo7ck944z
Smile
 
Reply
#20
"inserisci password: " è la pass LOLLLLL
 
Reply
#21
eheh... ero indeciso se utilizzare "esatto", "sbagliato" oppure "inserisci password: " XD
Avevo pensato che evitando di dichiarare una variabile dedicata alla password rendevo il reversing meno intuitivo...

In questo programma, a differenza del primo, ho allocato le variabili dinamicamente. Hai riscontrato cambiamenti sostanziali (più facile | più difficile) rispetto il primo o non l'hai risolto al primo colpo solo perché non ti era venuto in mente che avrei potuto nascondere la password in questo modo?
 
Reply
#22
rispetto l'altro è piu' complesso, non piu' difficile ma piu' complesso. A livello di risoluzione l'unico motivo che mi ha fatto perdere 10 minuti di piu' è che la password era la frase di richiesta e non una vera e propria pass, ma ste cose hanno vita molto breve Big Grin
 
Reply
#23
Ecco il terzo: http://www.megaupload.com/?d=ZDXRRJVY

Ho evitato l'interfaccia utente (eh si... un altro noioso programma da consolle) e sono rimasto su programmi da poche righe di codice. Almeno inizialmente preferirei cercare di capire su cosa è meglio focalizzare l'attenzione, in questo modo evito di perder tempo a "incasinare" parti totalmente inutili.

Aspetto feedback! Big Grin
 
Reply
#24
oh bene, questo è uno di quei crackme che si fa molto prima a patchare che keygennare. infatti l'ho crakkato modificando 1 solo byte.

mentre per quanto riguarda l'operazione di keygenning, inputando (per esempio) la stringa 'predator'
ci sono due cicli.
legge la lunghezza, poi parte dalla fine smistando la posizione dei caratterei dispari e pari (oppure uno no e uno si, il senso è il medesimo. potrebeb anche essere un for i con step -2),
decrementa il contatore
ignora la 'r' parte percio' con la 'o' che e moltiplica il suo valore decimale per l'attuale posizione del puntatore del ciclo
cioè 111 x 6 = 666
poi decrementa 2 volte e passa alla lettera 'a'
97x4=388
e cosi' via (mi pare salti la prima lettera)

poi parte nel senso opposto, da sinistra verso destra
sempre saltando 1 carattere (partendo dalla d) somma al suo valore decimale 48
fino all'ultima lettera

ho visto che fa altre operazioni di volore float, di divisaione o moltiplicazione, per alla fine confrontare con 68.
ma sinceramente non ho voglia di smazzarmi i conti al contrario, sarebbe solo quesione di tempo, nulla di difficile.
Non ho incontrato schemi di protezione Smile
 
Reply
#25
Ho usato una tecnica simile a quella descritta dal tuo secondo esempio nell'altro post:

(18-07-2011, 02:34 PM)Predator Ha scritto: esempio2:
trasformi il seriale inserito xorando il suo valore con un numero e ne confronti il risultato. in questo modo non confronti il seriale inserito ma uno trasformato.

Al posto di xorare ho inventato un algoritmo ricorsivo molto semplice, l'ho anche messo in thread, non per un guadagno in prestazioni (che teoricamente dovrebbero calare), ma per vedere cosa succedeva (niente di diverso, visto che l'hai trovato con la stessa facilità).
Il mio primo pensiero è stato che probabilmente sarebbe stato impossibile da prendere, se non creando un keygen bruteforce con l'algoritmo reversato (dopodiché è solo questione di tempo, forse anche parecchio tempo visto che la password può essere alfanumerica e di chissà che lunghezza). È anche probabile che ci siano soluzioni multiple, vista la semplicità dell'algoritmo.

(18-07-2011, 02:34 PM)Predator Ha scritto: oh bene, questo è uno di quei crackme che si fa molto prima a patchare che keygennare. infatti l'ho crakkato modificando 1 solo byte.

Eh si... quando l'ho fatto non avevi ancora postato gli esempi di come evitare l'uso di un semplice if, quindi è il solito controllo if a==b con il solo accorgimento di non scrivere la password in chiaro.

(18-07-2011, 02:34 PM)Predator Ha scritto: mentre per quanto riguarda l'operazione di keygenning, inputando (per esempio) la stringa 'predator'
ci sono due cicli.
legge la lunghezza, poi parte dalla fine smistando la posizione dei caratterei dispari e pari (oppure uno no e uno si, il senso è il medesimo. potrebeb anche essere un for i con step -2),
decrementa il contatore
ignora la 'r' parte percio' con la 'o' che e moltiplica il suo valore decimale per l'attuale posizione del puntatore del ciclo
cioè 111 x 6 = 666
poi decrementa 2 volte e passa alla lettera 'a'
97x4=388
e cosi' via (mi pare salti la prima lettera)

poi parte nel senso opposto, da sinistra verso destra
sempre saltando 1 carattere (partendo dalla d) somma al suo valore decimale 48
fino all'ultima lettera

ho visto che fa altre operazioni di volore float, di divisaione o moltiplicazione, per alla fine confrontare con 68.
ma sinceramente non ho voglia di smazzarmi i conti al contrario, sarebbe solo quesione di tempo, nulla di difficile.
Non ho incontrato schemi di protezione Smile

Visto che non sei intenzionato di perder tempo dietro un algoritmo stupido, ma di lungo reversamento (buono a sapersi in caso mi dovesse capitare di proteggere qualcosa Big Grin ), ti posto il codice incriminato:

Codice PHP:
void ret(std::string *p_pwd)
{
    if((
sqrtf(348935.59375) + 0.00001373140844) == elaboraPwd(p_pwd->c_str(), p_pwd->size(), 9)) 
        
std::cout << "esatto";
    else 
        
std::cout << "sbagliato";
}

double elaboraPwd(const char pwd[], short lengthdouble v)
{
    if(
length == 0
        return 
v;
    else if(
length 2// dispari
        
double(pwd[length] + '0') / length elaboraPwd(pwdlength-1v);
    else 
//pari
        
pwd[length] * length elaboraPwd(pwdlength-1v); //ora che rivedo il codice mi accorgo che manca il cast XD lol, pazienza
    
return v;


Nel main viene chiamata la funzione ret con un puntatore alla stringa inserita dall'utente come parametro.
Per costruirlo mi è bastato inventare una password (ho scelto: TopSecret; avrei anche potuto sceglierla alfanumerica, tu non potevi saperlo) e passarla come parametro a elaboraPwd (mettendo anche la lunghezza e un numero random [ho scelto il 9] come parametri). Il numero uscito l'ho elevato al quadrato e l'ho inserito come costante nel programma; nel programma il numero vine messo sotto radice quadrata (questi ultimi 2 passaggi quasi inutili, servono solo a mascherare ancor più la password).
Curioso notare che facendo sqrtf(pow(numero_elaborato_secondo_la_password_da_me_scelta)); c'è un errore di approssimazione... infatti ho dovuto aggiungere 0.00001373140844 per far corrispondere i calcoli.

Anche avendo il codice a disposizione, il modo migliore per beccare la password sarebbe un bruteforce... ad eseguire i calcoli alla rovescia non ti passa più (sempre che si riesca a fare).
Non ho provato a farlo, ma penso che per un algoritmo così semplice sia questione di minuti per un bruteforce.
Lo ammetto, sono stato un po' bastardo a dar la possibilità di password con lettere e numeri XD
a scriverlo è un algoritmo proprio semplice... a reversarlo non saprei.
 
Reply
#26
heheeheh grazie per il source Smile
avevo visto anche la radice quadrata.
io non sono bravissimo con l'arte del keygenning, e siccome avevi usato numeri con molte virgole, sqrtf(348935.59375) + 0.00001373140844) ci avrei messo sicuramente diverse ore.
 
Reply
#27
Prima di cimentarmi con un CrackMe complicato (é da me Big Grin) prova e vedi se trovi difficoltà con gli exe di Dark Basic

http://www.megaupload.com/?d=2HUJKCSK

L'ho scritto in un oretta quindi é di una facilità estrema ma é solo per provare se ci sono impedimenti. Fammi sapere
 
Reply
#28
E' strapieno strapieno strapieno di referenze e codice inutili ai fini del codice.
c'è anche una infinità di riferimenti alle directx, e dll di ogni genere. Probabilmente perchè è fatto per giochi? Inoltre decomprime nella temp una serie di dll e file.
Al punto della password ho trovato una valanga di IF, non so se li hai fatti te. ho decisamente patchato ed è uscito
La password sembra giusta.

Di certo DarkBasic è un linguaggio che non sa cosa sia l'ottimizzazione. del resto 712 Kb di codice compresso per fare un if è decisamente esagerato. Neppure VB6 arriva a questi livelli LOL
 
Reply
#29
Si Dark Basic é fatto per i giochi quindi sfiderei che non ci sono riferimenti a directx o dll, ma alla fine bisogna essere sempre flessibile nel proprio "lavoro" Smile

Codice:
INPUTPASS:
Input "Password> ",P$

Qui c'è l'input iniziale

Codice:
If len(P$)=5

    An$=left$(P$,1)
    
    If An$="A" or An$="B" or An$="C" or An$="D" or An$="E"
    
        An$=Left$(P$,4)
        An$=Right$(An$,3)
        
        If Val(An$)=>0 and Val(An$)<=100
            
            An$=right$(P$,1)
            
            If An$="X" or An$="Y" or An$="Z"
            
            Print "La password sembra corretta!"
            Wait key
            End
            
            Endif
            
        Endif
        
    Endif
  
    If An$="F" or An$="G" or An$="H" or An$="I" or An$="L"
    
        An$=Left$(P$,4)
        An$=Right$(An$,3)
        
        If Val(An$)=>50 and Val(An$)<=150
            
            An$=right$(P$,1)
            
            If An$="A" or An$="B" or An$="C" or An$="D" or An$="E"
            
            Print "La password sembra corretta!"
            Wait key
            End
            
            Endif
            
        Endif
        
    Endif
    
    If An$="X" or An$="Y" or An$="Z"
    
        An$=Left$(P$,4)
        An$=Right$(An$,3)
        
        If Val(An$)=>20 and Val(An$)<=75
            
            An$=right$(P$,1)
            
            If An$="F" or An$="G" or An$="H" or An$="I" or An$="L"
            
            Print "La password sembra corretta!"
            Wait key
            End
            
            Endif
            
        Endif
        
    Endif
    
    
Endif

Queste dovrebbero essere la valanga di IF che dovresti aver trovato ed isolato che gestiscono l'analisi dell'input iniziale


Codice:
Print "Password Errata!"
wait key
goto INPUTPASS

Se qualcosa non torna si torna all'Etichetta iniziale



Difficoltà? Big Grin
 
Reply
#30
heheh allora la valanga di if li avevi proprio scritti te Big Grin
difficoltà: se togliamo la grande confusione creata da darkbasic è veramente facile, sia keygennare che patchare :-)
 
Reply
  


Vai al forum:


Browsing: 1 Ospite(i)