Reto Crackme 6 De Flamer

Iniciado por Flamer, 3 Agosto 2012, 18:21 PM

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

MCKSys Argentina

Keygen (en VB6)

Suponiendo que en un form hay un boton (Command1) y un textbox (Text1):

Function getForcedChar(testInt As Integer) As String
Dim hallado As Boolean
Dim car As Integer
Dim valor As Integer

hallado = False
Do While (Not hallado)
    car = Int((91 * Rnd) + 32)
    valor = ((((((car + &H6B - 4) * 5) / 2) * 3) Xor &H19C) And 1)
    hallado = (valor = testInt)
Loop
getForcedChar = Chr(car)
End Function


Private Sub Command1_Click()
Dim serial As String
Dim i As Integer

For i = 1 To 20
    serial = serial + getForcedChar(IIf((i = 3) Or (i = 5) Or (i = 13) Or (i = 17), 1, 0))
Next i
Text1.Text = serial
End Sub


Analisis:

len serial=20 chars
str((((((chr(serial) + 6Bh - 4) * 5) / 2) * 3) xor 19Ch) & 1) = "00101000000010001000"


Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Tinkipinki

Gracias MCKSys, con el codigo que has posteado se puede ver claramente como trabaja el algoritmo de calculo del serial a parte que nos brinda la oportunidad de adentrarnos un poco mas sobre la programacion en VB para los que no dominamos este entorno ;-)

Saludos

Flamer

Balla fly eres buenisimo para esto felisidades
para la otra tela pondre mas difisil

saludos flamer ya te anote en la lista

ThunderCls

Hola
Ya veo que MCKSys lo resolvio, felicidades amigo  ;-)
Igual solo hare unos apuntes de mi parte.

Serial Facil
========

Código (cpp) [Seleccionar]
for(int i = 0; i < strlen(serial); i++)
{
   val = serial[i] + 0xE0;
   strcat(serialfinal, val);
}


Name: Thunder
Serial: 13414815514E144145152

Nota: En esta parte del crackme hay un bug(al no ser que se haya echo conscientemente), cada vez que insertas un serial incorrecto, se acumulan las cadenas del serial correcto una a continuacion de la otra, ej: Serial correcto para nuestro name: 123
Si ponemos 4 veces un serial incorrecto el serial correcto ya no seria 123, sino 123123123123123, por lo que creo que se ha olvidado de limpiar la variable en cada intento y de ahi el bug.

Serial Dificil
=========

length = 20
Bit = ((((serial + 0x67 * 5) / 2) * 3) xor 0x19C) and 1

Tomando solo numeros por flojera podemos crearnos una tabla:
Tabla de Bits
==========

1234567890
0010001000

Ahora solo ubicamos los numeros para lograr la serie de bits correctos
Bits correctos = 00101000000010001000
Serial: 12343668901234567890

PD: Una ultima acotacion, pal cuida el idioma si?, muchas faltas de ortografia en los textos...(critica constructiva :P). Por lo demas no ha estado mal, sigue por ese camino.
Un saludo a todos y...Tinkipinki te invito a que revises bien la parte facil para que veas que no era dificil sacar un serial valido para tu nick.
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

Flamer

Hola Thunder si es error mio lo del bug orita biendo el codigo fuente me falto limpiar la variable pero en fin felisidades sebe que eres bueno como fly

boy a notarte en la lista

a mi ortografia no puedo mejorar, boy a tener que buscar una pagina de autocorrecion

saludos Flamer

MCKSys Argentina

Cita de: Flamer en  6 Agosto 2012, 21:38 PM
a mi ortografia no puedo mejorar, boy a tener que buscar una pagina de autocorrecion

SIEMPRE se puede mejorar. Es cuestión de perseverar...  ;)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


apuromafo CLS

#16
felicidades a thunder
bueno, a lo mas tengo un mini tiempo y comento:

mi kg para tu primera instancia de ejecución, aunque intente hacerlo mejor, siempre me crasheo..asi que adjunto lo unico que me resulto:
tu programa y mi kg para el primer nivel, hecho en c++
http://www.mediafire.com/?pvvx5vyu4b8odld


detalles normales_ que habia tenido para el 1, pero que a la hora por no ser buen coder obviamente no habia pensado en keygen


para usuario serial /nivel 1 tomas los valores:
DS:[0040102C]=7348B48B (msvbvm60.rtcAnsiValueBstr)
pero vemos una comprobacion

00409C53   . 83F8 04        CMP EAX,4
00409C56   . 0F9FC2         SETG DL

por ende el primer usuario debe ser igual o mayor a 4 carácteres
como hay un detenimiento no puede ser mayor a 15

mas adelante se ve (integrer) (smartcheck) el cual confirma los valores,

mientras revisaba hoy mi codigo vi que  thunder posteó su solucion y descubrimiento del bug, eso me confirmo el tema ,


val = serial + 0xE0;
el + E0 viene de aqui

00409DF3   . 8D95 74FFFFFF  LEA EDX,DWORD PTR SS:[EBP-8C]
00409DF9   . 66:81C1 E000   ADD CX,0E0
00409DFE   . 8D45 B4        LEA EAX,DWORD PTR SS:[EBP-4C]

pero a diferencia de otros lenguajes, termina en 00 y este es descartado del serial (00+E0)

yo de primera preferia este el lugar para fishear  con Bp condicional en ECX==0 y el valor a loguear CX
00409E09   . 66:890F        MOV WORD PTR DS:[EDI],CX                 ;  fish

Name:apuromafo
serial:14115015515214F14D14114614F


la concatenacion
00409E2E   . FF15 B0104000  CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarCa>;  msvbvm60.__vbaVarCat

^^
ahora bien portando la idea en C
codigo keygen tipo en C++ codeblock mingw
el que use yo fue

http://prdownload.berlios.de/codeblocks/codeblocks-10.05mingw-setup.exe




#include <conio.h>
#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>
    using namespace std;

int  main()
{
char palabra[20],c=' ';

printf(" Keygen Sakura by Apuromafo 06-8-12 \n");
printf(" Nivel user-serial nivel 1 de 2 niveles \n");
printf(" para Crackme 6 de Flamer   \n");
printf(" OBS:serial valido solo para la primera ejecucion, x bug del bufer\n");
printf(" Uso:Ingresa usuario y te dira el serial (osea +0xE0) \n");
printf(" favor mas de 4 letras el nombre  y menos de 15 \n\n ");
printf(" hecho solo por un mini tiempo libre  \n\n ");

printf("Usuario = ");
scanf("%s",palabra);
printf("Serial  = ");
int cont=0,mayor=0,tam=strlen(palabra);
for(int i=0;i<=tam;i++)
{
if(c!=palabra[i])
{
if(cont>mayor)
mayor=cont;
c=palabra[i];
cont=1;
}
else

cont++;

      int opc1;

     opc1 = (palabra[i] + 0xE0);
if(opc1!=0xE0)
      printf("%X", opc1);
      }
      getch();




apuromafo CLS

#17
flamer, para que no te enojes, te edito el post anterior y te agrego el keygen del nivel 1 en c++
, obviamente por tema de tiempo no fixeo los tamaños de largo y porque mi nivel de programación es bajo en esos temas sobre todo porque siempre c++ me tiende a explotar los exes jiji

saludos Apuromafo

pd:
normalmente para la primera vez es
Nombre:apuromafo
serial:14115015515214F14D14114614F
para la segunda  vez que ejecutas (es como si fuera apuromafoapuromafo)
usuario:apuromafo
serial:14115015515214F14D14114614F14115015515214F14D14114614F

esta considera apuromafoapuromafo para la validacion, pero uno simplemente coloco apuromafo en la 2da vez...esop, animo en todo

Flamer

hola apuromafo no te molestes no me enojo esta bien solo que boy a tener que modificar la tabla de tus logros donde dise serial boy aponer keygen pero te informo te quedas en terser lugar

nose si queden conformes con los lugares que lesdi, pero aclaro todos son buenos Crackers;-) ;-) ;-)

saludos Flamer

apuromafo CLS

#19
no hay lio, igual fue un gran crackme para confirmar :D

, no tengo el tiempo como todos, pero apesar de estar oxidado algo se logra.-


respecto al numero 2 bajo la idea de los bytes por thunder:
mediante array los 20 numeros (en c++) y arrays
adjunto como keygen para el LV 2
http://www.mediafire.com/?fjnjjw0pxxgoin2


#include <iostream>
#include <algorithm>
#include<stdlib.h>
#include<iostream>
#include<time.h>
using namespace std;

int main(void)
{
   int num,c;
   srand(time(NULL)); //00101000000010001000

   for(c=1;c<=2;c++)   //XX101000000010001000
   {
        int array[] = { 1,2,4,5,6,8,9,0 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+8);
        for(int i=0; i<1; i++)
       cout << array[i] <<"";// << endl;
      // num=1+rand()%(11-1);
   //    cout<<num<<"";
   }
         int array[] = { 3,7 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+1);
       for(int i=0; i<1; i++)
       cout << array[i]<<"";// << endl;


   //    cout<<"3"; //00X01000000010001000

    for(c=4;c<=4;c++)//001x1000000010001000
   {
     //  num=1+rand()%(11-1);
       //cout<<num<<"";
       int array[] = { 1,2,4,5,6,8,9,0 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+7);
       for(int i=0; i<1; i++)
       cout << array[i]<<"";// << endl;
   }
     int Array1[] = { 3,7 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(Array1, Array1+1);
       for(int i=0; i<1; i++)
       cout << array[i]<<"";// << endl;


   //        cout<<"3"; //0010X000000010001000
    for(c=6;c<=12;c++) //00101X00000010001000
   {
     //  num=1+rand()%(11-1);
       //cout<<num<<"";
       int array[] = { 1,2,4,5,6,8,9,0 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+6);
       for(int i=0; i<1; i++)
       cout << array[i] <<"";// << endl;
   }
//          int Array1[] = { 3,7 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(Array1, Array1+1);
       for(int i=0; i<1; i++)
       cout << array[i]<<"";// << endl;
   //       cout<<"3"; //0010X000000010001000
    for(c=14;c<=16;c++) //00101X00000010001000
      {
     //  num=1+rand()%(11-1);
       //cout<<num<<"";
       int array[] = { 1,2,4,5,6,8,9,0 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+5);
       for(int i=0; i<1; i++)
       cout << array[i] <<"";// << endl;
   }
      //   int Array1[] = { 3,7 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(Array1, Array1+1);
       for(int i=0; i<1; i++)
       cout << array[i]<<"";// << endl;

   //   cout<<"3"; //0010X000000010001000
     for(c=18;c<=20;c++) //00101X00000010001000
  {
     //  num=1+rand()%(11-1);
       //cout<<num<<"";
       int array[] = { 1,2,4,5,6,8,9,0 };
       srand( unsigned( time(NULL) ) );
       random_shuffle(array, array+4);
       for(int i=0; i<1; i++)
       cout << array[i] <<"";// << endl;
   }

   cin.get();
}