Test Foro de elhacker.net SMF 2.1

Programación => Ingeniería Inversa => Mensaje iniciado por: mr.blood en 13 Marzo 2013, 15:04 PM

Título: [Keygenme] Aspid
Publicado por: mr.blood en 13 Marzo 2013, 15:04 PM
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 (https://mega.co.nz/#!SBMwnYaI!H38XpDvraZCjxlwkECwDKkCVlBAC2OnYi8SiIBeYoDg)

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




Hall of Fame
Sa1uDoS
Título: Re: [Keygenme] Aspid
Publicado por: tincopasan en 13 Marzo 2013, 20:59 PM
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!
Título: Re: [Keygenme] Aspid
Publicado por: MCKSys Argentina en 14 Marzo 2013, 11:28 AM
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!
Título: Re: [Keygenme] Aspid
Publicado por: mr.blood en 14 Marzo 2013, 18:53 PM
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
Título: Re: [Keygenme] Aspid
Publicado por: MCKSys Argentina en 14 Marzo 2013, 19:24 PM
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...
Título: Re: [Keygenme] Aspid
Publicado por: mr.blood en 14 Marzo 2013, 19:25 PM
Era por que durara mas el reto xD. En unos dias (sobre el Domingo) publico el codigo en este mismo post.

Sa1uDoS
Título: Re: [Keygenme] Aspid
Publicado por: tincopasan en 14 Marzo 2013, 19:56 PM
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
Título: Re: [Keygenme] Aspid
Publicado por: mr.blood en 21 Marzo 2013, 16:40 PM
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.
Título: Re: [Keygenme] Aspid
Publicado por: tincopasan en 21 Marzo 2013, 17:42 PM
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.