[Keygenme] Aspid

Iniciado por mr.blood, 13 Marzo 2013, 15:04 PM

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

mr.blood

Bueno, aqui les traigo un Keygenme nuevo.

Dificultad: [3/10] Me parece a mi...
Compilador: GCC
Objetivo: Hacer un Keygen.

Los Keygen por privado por favor.

Crackme

Espero que os guste y no lo reventeis en menos de 10 min jaja.




Hall of Fame

  • MCKSys Argentina
  • tincopasan
Sa1uDoS

tincopasan

#1
Saludos mr.blood
                          sanguinario el nick jeje. entender el algoritmo de validación es fácil, menos de 10 minutos! pero soy muy perro para programar así que el keygen me llevará como 5 hs jaja. Ahora voy a trabajar, así que espero subirlo mañana. Buen laburo para practicar.
Bueno tuve un tiempito y te mandé el keygen!

MCKSys Argentina

#2
Cita de: mr.blood en 13 Marzo 2013, 15:04 PM
Los Keygen por privado por favor.

:huh:

Keygen en python:

Código (python) [Seleccionar]

import random
import subprocess

def getSum (cadena):
   sum = 0
   for i in range(len(cadena)-1):
       sum += ord(cadena[0]) + ord(cadena[i+1])
   return sum

def getS0 (numero, largo):
   for i in '0123456789ABCDEF':
       if ((ord(i) * (largo - 1)) + (48 * (largo - 1))) > numero:
           break
   return i

def getSn1 (s0, largo, numero):
   for i in range(largo-1):
       cad = s0 + 'F' * (i+1)
       ncad = cad + ('0' * (largo - (i+2)))
       if getSum(ncad) > numero:
           break
   return 'F' * i

def get2ndString(numero):
   lens = (numero / 140) + 2
   s0 = getS0(numero, lens)
   sn1 = getSn1(s0, lens, numero)
   hallado = False
   valor = 1
   while not hallado:
       snn = hex(valor).replace('0x','').upper()
       largo = lens - (len(sn1) + len(snn) + 1)
       cadena = s0 + sn1 + snn + ('0' * largo)
       hallado = (getSum(cadena) == numero)
       valor += 1
   return s0 + '0' + sn1 + snn + ('0' * largo)

def main():
   sid = raw_input('Ingrese ID:')
   print('F4C3B4C0\n' + get2ndString(int(sid)))

if __name__ == '__main__':
   main()


PD: El programa es explotable. Si como pass ingresan un numero hexa cualquiera (por ej. A), luego enter y luego un string de 256 bytes, pisaran el return address de la funcion que hace la validación de la pass y podran hacer lo que quieran. No se pueden pasar ceros, pero se carga msvcrt, lo que permite jugar un poco.

EDIT: Si hago tiempo armo un mini tutorial.

Saludos!
MCKSys Argentina

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


mr.blood

Espero que os haya gustado!




MCKSys Argentina Para entrar a la funcion de registrar deberias hacer una shellcode inyectarla, descifrar esa sección y cambiar la RET_Addr por la Addr de la funcion.

Por privado significa por Mensaje Privado ;).

Sa1uDoS

MCKSys Argentina

Cita de: mr.blood en 14 Marzo 2013, 18:53 PM
MCKSys Argentina Para entrar a la funcion de registrar deberias hacer una shellcode inyectarla, descifrar esa sección y cambiar la RET_Addr por la Addr de la funcion.

En principio seria asi. Como dije, se puede hacer cualquier cosa una vez pisado el retAddr.

Cita de: mr.blood en 14 Marzo 2013, 18:53 PM
Por privado significa por Mensaje Privado ;).

Claro. Lo que puse es porque no estoy de acuerdo en hacer este tipo de cosas en forma privada. Si el reto es publico, tambien lo es la solucion...  :P

Ese es el espiritu CLS!  ;D

Saludos!

PD: El tutorial demorara un poquito...
MCKSys Argentina

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


mr.blood

Era por que durara mas el reto xD. En unos dias (sobre el Domingo) publico el codigo en este mismo post.

Sa1uDoS

tincopasan

subi el keygen a la bosta de mediafire y lo bloquea! ahora lo subo a mega:
https://mega.co.nz/#!TFliACgQ!ITdfEUjQGXO1jC49DDbZ4TQotY4x6aLt-CSSagGLxmg

MCKSys que facil lo haces! en vb tuve q hacer como 10 llamadas! jaja q perro q soy

mr.blood

#7
Bueno, como nadie mas se anima posteo el codigo.
Tuve que retocar la PE Section y cifrar la funcion felicita().

Para compilar
Código (consola) [Seleccionar]
fasm funcion.asm
gcc crackme.c funcion.obj -o crackme.exe


Código (asm) [Seleccionar]
format coff

public _asm_comp

       _asm_comp:
               push ebp
               mov ebp, esp

               xor eax, eax ;Limpiamos los registros
               xor ecx, ecx

               mov ebx, dword[esp+8] ;Movemos a ebx la direccion de felicita
               mov ebx, dword[ebx]
               mov edx, dword[esp+12] ;Movemos a edx la pass
               bucle:
                       xor dword[edx+ecx], ebx ;desciframos felicita
                       add ecx, 4 ;Sumamos al contador un DWORD
                       cmp ecx, 0x18 ;Comparamos el contador con 24
                       jne bucle ;Si no es igual salta a bucle
               cmp word[edx+5], 0xC718 ;Comparamos la firma (edx+5) para ver si la clave fue correcta
               je exit ;Si es igual salimos (eax=0)
               inc eax ;Incrementamos eax

               exit:
               leave
               ret



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int comp(char *cadena);
void felicita();
int asm_comp(void *buff, void *func);

int main()
{
       srand(time(NULL));
       unsigned int ID=rand()%(9999-1000)+1000, i;
       char buffer[100];
       unsigned int pass;
       printf("ID> %i\nPass> ", ID);
       scanf("%8x%s", &pass, buffer);
       if(comp(buffer)==1)
       {
               printf("Wrong pass\n");
               getchar();
               return 1;
       }

       for(i=2;i<strlen(buffer);i++)
       {
               ID-=buffer[0]+buffer[i];
       }
       if(ID==0)
       {
               if(asm_comp(&pass, felicita)==0)
               {
                               felicita();
                               return 0;
               }
               printf("Wrong pass\n");
               getchar();
               return 1;
       }
       printf("Wrong pass\n");
       getchar();
       return 1;
}

int comp(char *cadena)
{
       int i;
       for(i=0;i<strlen(cadena);i++)
       {
               if(!((cadena[i]>='0' && cadena[i]<='9') || (cadena[i]>='A' && cadena[i]<='F')))
               {
                       return 1;
               }
       }
       return 0;
}

void felicita()
{
       printf("Registered\n");
       getchar();
}


Gracias a los que participaron! Que les parecio? Muy simple?

Sa1uDoS

P.D.: Se me complico un poco la semana, siento no haberlo publicado el Domingo.

tincopasan

saludos mr.blood
Me parece buen trabajo, en cuanto a la dificultad depende de cada uno, soy bastante malo y no me llevo ver la forma de obtener el serial más de 10 minutos, supongo q a otros mucho menos, pero es que ya se han hecho varios así, pero insisto que está bueno para practicar.