CrackMe if you can III (Reborn)

Iniciado por Karman, 15 Enero 2013, 06:00 AM

0 Miembros y 1 Visitante están viendo este tema.

Karman

Tras mucho tiempo de no postear en este foro, me decidí hacer este pequeño y tonto crackme para el que tenga ganas de jugar con el... cabe aclarar que es demasiado simple como para parchearlo por lo que la idea es obtener un usuario y clave válido por lo menos (aunque un keygen no es muy complicado una vez entendido el algoritmo)... :P

Sin más preámbulo se los dejo: CrackMe if you can III (Reborn)

S2

apuromafo CLS

demasiado simple parcharlo?
004017C3   837D EC 00       CMP DWORD PTR SS:[EBP-0x14],0x0
004017C7   74 07            JE SHORT crackme.004017D0                    ;lugar vulnerable a ser parchado
004017C9   A1 08304000      MOV EAX,DWORD PTR DS:[0x403008]
004017CE   EB 05            JMP SHORT crackme.004017D5
004017D0   A1 04304000      MOV EAX,DWORD PTR DS:[0x403004]


luego mostraría
Citar---------------------------
CrackMe If You Can III (Reborn)
---------------------------
Clave Correcta, Ahora Haz un Tutorial!
---------------------------
Aceptar   



interesante tus rutinas, espero alguien se anime a intentar un usuario y serial.
largo del nombre
00401869   E8 1E030000      CALL <JMP.&KERNEL32.lstrlenA>
0040186E   83EC 04          SUB ESP,0x4
00401871   83F8 03          CMP EAX,0x3                               ;comparacion con largo
00401874   7F 2E            JG SHORT crackme.004018A4


largo del serial

004018AA   E8 DD020000      CALL <JMP.&KERNEL32.lstrlenA>
004018AF   83EC 04          SUB ESP,0x4
004018B2   83F8 07          CMP EAX,0x7                ;comparacion con largo
004018B5   7F 2B            JG SHORT crackme.004018E2



Mad Antrax

Ueeeee, mi primer crackme ajeno que consigo destripar :P (llevo 3 dias con este tema del craking)

Me ha gustado mucho, yo estoy terminando de programar un crackme sencillito, en breve lo subo para que probéis :D

PD: Solo he logrado parchear el exe, no he visto el serial por ninguna parte :(
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

tincopasan

Saludos!  Gracias por el crackme, es fácil, aunque me llevó como una hora porque soy un poco inútil! La verdad no había visto una rutina como la tuya! será porque no le entendí un carajo jeje!
solución para mi: user tinco pass 0CA0B75F
éxitos

Karman

Cita de: tincopasan en 17 Enero 2013, 11:04 AMSaludos!  Gracias por el crackme, es fácil, aunque me llevó como una hora porque soy un poco inútil! La verdad no había visto una rutina como la tuya! será porque no le entendí un carajo jeje!
solución para mi: user tinco pass 0CA0B75F
éxitos

sip, lo solucionaste!, ahora solo faltaría que explicaras como hiciste! :P

S2

tincopasan

Una pequeña explicación de lo que hice:

Aclaración: los que me conocen de otro lado saben que no sé que significa mov al,1  mi amigo solid me lo explicó hace como 4 años pero mi neurona no aprende.
Por lo tanto pido disculpas a los que realmente saben por mi atrevimiento.

Y al autor del crackme: dije que es fácil porque
en escala de 1 a 10

       mis conocimientos de ensamblador = 1    (cmp,jmp,je)
                                    uso del ollydbg = 3    mirar stack, F7 y F8
          conocimientos de apis o funciones= 1    GetDlgItemTextA
Sin embargo lo resolvi!         



1) no tiene protección extra.

2) al cargarlo en olly se ve en el dump

         00403004  00404084  ASCII "Clave Correcta, Ahora Haz un Tutorial!"
         00403008  004040AC  ASCII "Clave Incorrecta, Sigue Intentando :P!"


3) en la ventana C busco la constante 403004

004017BE  E8 01040000    CALL <JMP.&msvcrt.printf>                ni idea!         
004017C3  837D EC 00     CMP DWORD PTR SS:[EBP-14],0              compara con 0
004017C7  74 07             JE SHORT crackme.004017D0                si no salta... a llorar al campito
004017C9  A1 08304000    MOV EAX,DWORD PTR DS:[403008]            chico malo
004017CE  EB 05          JMP SHORT crackme.004017D5
004017D0  A1 04304000    MOV EAX,DWORD PTR DS:[403004]            chico bueno!
004017D5  C9             LEAVE
004017D6  C3             RETN

4) como tiene que tomar el usuario y nombre bp en recuperadores de texto en este caso es:

00401836  E8 09030000    CALL <JMP.&USER32.GetDlgItemTextA>      adquiere el usuario
0040185B  E8 E4020000    CALL <JMP.&USER32.GetDlgItemTextA>      adquiere el serial
         
00401869  E8 1E030000    CALL <JMP.&KERNEL32.lstrlenA>           toma el nombre y saca el largo
00401871  83F8 03        CMP EAX,3
00401874  7F 2E          JG SHORT crackme.004018A4               tiene que ser mayor a 3 caracteres
         
004018AA  E8 DD020000    CALL <JMP.&KERNEL32.lstrlenA>           toma el serial y saca el el largo
004018B2  83F8 07        CMP EAX,7                               
004018B5  7F 2B          JG SHORT crackme.004018E2               tiene que ser mayor a 7 caracteres 


5)       004018FE  E8 C9020000    CALL <JMP.&msvcrt.strtoul>              ni idea! 
         0040190B  E8 C7010000    CALL crackme.00401AD7                   ni idea!
         00401910  895C24 04      MOV DWORD PTR SS:[ESP+4],EBX            obvio que ni idea!
                                                                          pero eax = 5DCAAB1C


6)       004017BE  E8 01040000    CALL <JMP.&msvcrt.printf>               ni idea!
       
en el stack...

        0022F974   00404188    |format = "%X %X %X
"
        0022F978   5DCAAB1C    |<%X> = 5DCAAB1C       conocido
        0022F97C   12503760    |<%X> = 12503760          mi serial
        0022F980   1A538001    \<%X> = 1A538001          ni idea!

7)      004017C3     837D EC 00    CMP DWORD PTR SS:[EBP-14],0
       
        se ve:  Stack SS:[0022F988]=1A538001 comparado con 0

8) por lo tanto solo hay que comprobar 3 cosas:
       
       a) ¿se obtiene a partir del nombre?   tinco = 5DCAAB1C
          prueba:                            pepe  = 16809A6A 
                                             tincopasan = 9066930C
          o sea: ni idea que hace pero queda una cadena hexadecimal de 8 caracteres                 
     
       b) ¿qué pasa si cambio el serial?
          1250376T
       stack
          0022F978   5DCAAB1C    |<%X> = 5DCAAB1C nombre
          0022F97C   01250376    |<%X> = 1250376  ¿y la T?
          0022F980   0D8C541B    \<%X> = D8C541B  ajá!!!!   resultado
     
         haciendo pruebas llegué a la conclusión que solo toma caracteres hexadecimales y que no hay que superar el 

         máximo valor porque sino queda  FFFFFFFF
       
          0022F974   00404188    |format = "%X %X %X
"
          0022F978   5DCAAB1C    |<%X> = 5DCAAB1C
          0022F97C   FFFFFFFF    |<%X> = FFFFFFFF
          0022F980   0CE358A0    \<%X> = CE358A0
       
       c)  ¿qué pasa si pongo como serial 5DCAAB1C?
           0022F978   5DCAAB1C    |<%X> = 5DCAAB1C
           0022F97C   5DCAAB1C    |<%X> = 5DCAAB1C
           0022F980   5129F3BD    \<%X> = 5129F3BD  no da 0! :-(


          ¿y si modifico el serial cambia todo el resultado o solo 1 caracter?
          0022F978   5DCAAB1C    |<%X> = 5DCAAB1C
          0022F97C   5DCAAB1F    |<%X> = 5DCAAB1F   serial nuevo, ya hay un 0
          0022F980   AED60C40    \<%X> = AED60C40


ok       0022F978   5DCAAB1C    |<%X> = 5DCAAB1C
         0022F97C   5DCAAB5F    |<%X> = 5DCAAB5F   cambiando de a un caracter voy obteniendo los 0
         0022F980   AED60C00    \<%X> = AED60C00

En resumen si pruebo de a un caracter (total son solo 16 por cada uno)

        0022F974   00404188    |format = "%X %X %X
"
        0022F978   5DCAAB1C    |<%X> = 5DCAAB1C
        0022F97C   0CA0B75F    |<%X> = CA0B75F     el serial es = 0CA0B75F
        0022F980   00000000    \<%X> = 0           resultado buscado!!!



         



           
   






Karman

está bien, resolviste el algoritmo por fuerza bruta... es válido :P, faltaría que alguien haga un keygen (es muy simple viendo lo que encontró tincopasan)

S2