Foro de elhacker.net

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
  • MCKSys Argentina
  • tincopasan
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
Los Keygen por privado por favor.

 :huh:

Keygen en python:

Código
  1. import random
  2. import subprocess
  3.  
  4. def getSum (cadena):
  5.    sum = 0
  6.    for i in range(len(cadena)-1):
  7.        sum += ord(cadena[0]) + ord(cadena[i+1])
  8.    return sum
  9.  
  10. def getS0 (numero, largo):
  11.    for i in '0123456789ABCDEF':
  12.        if ((ord(i) * (largo - 1)) + (48 * (largo - 1))) > numero:
  13.            break
  14.    return i
  15.  
  16. def getSn1 (s0, largo, numero):
  17.    for i in range(largo-1):
  18.        cad = s0 + 'F' * (i+1)
  19.        ncad = cad + ('0' * (largo - (i+2)))
  20.        if getSum(ncad) > numero:
  21.            break
  22.    return 'F' * i
  23.  
  24. def get2ndString(numero):
  25.    lens = (numero / 140) + 2
  26.    s0 = getS0(numero, lens)
  27.    sn1 = getSn1(s0, lens, numero)
  28.    hallado = False
  29.    valor = 1
  30.    while not hallado:
  31.        snn = hex(valor).replace('0x','').upper()
  32.        largo = lens - (len(sn1) + len(snn) + 1)
  33.        cadena = s0 + sn1 + snn + ('0' * largo)
  34.        hallado = (getSum(cadena) == numero)
  35.        valor += 1
  36.    return s0 + '0' + sn1 + snn + ('0' * largo)
  37.  
  38. def main():
  39.    sid = raw_input('Ingrese ID:')
  40.    print('F4C3B4C0\n' + get2ndString(int(sid)))
  41.  
  42. if __name__ == '__main__':
  43.    main()
  44.  

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
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.

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
  1. fasm funcion.asm
  2. gcc crackme.c funcion.obj -o crackme.exe

Código
  1. format coff
  2.  
  3. public _asm_comp
  4.  
  5.        _asm_comp:
  6.                push ebp
  7.                mov ebp, esp
  8.  
  9.                xor eax, eax ;Limpiamos los registros
  10.                xor ecx, ecx
  11.  
  12.                mov ebx, dword[esp+8] ;Movemos a ebx la direccion de felicita
  13.                mov ebx, dword[ebx]
  14.                mov edx, dword[esp+12] ;Movemos a edx la pass
  15.                bucle:
  16.                        xor dword[edx+ecx], ebx ;desciframos felicita
  17.                        add ecx, 4 ;Sumamos al contador un DWORD
  18.                        cmp ecx, 0x18 ;Comparamos el contador con 24
  19.                        jne bucle ;Si no es igual salta a bucle
  20.                cmp word[edx+5], 0xC718 ;Comparamos la firma (edx+5) para ver si la clave fue correcta
  21.                je exit ;Si es igual salimos (eax=0)
  22.                inc eax ;Incrementamos eax
  23.  
  24.                exit:
  25.                leave
  26.                ret
  27.  
  28.  

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. int comp(char *cadena);
  7. void felicita();
  8. int asm_comp(void *buff, void *func);
  9.  
  10. int main()
  11. {
  12.        srand(time(NULL));
  13.        unsigned int ID=rand()%(9999-1000)+1000, i;
  14.        char buffer[100];
  15.        unsigned int pass;
  16.        printf("ID> %i\nPass> ", ID);
  17.        scanf("%8x%s", &pass, buffer);
  18.        if(comp(buffer)==1)
  19.        {
  20.                printf("Wrong pass\n");
  21.                getchar();
  22.                return 1;
  23.        }
  24.  
  25.        for(i=2;i<strlen(buffer);i++)
  26.        {
  27.                ID-=buffer[0]+buffer[i];
  28.        }
  29.        if(ID==0)
  30.        {
  31.                if(asm_comp(&pass, felicita)==0)
  32.                {
  33.                                felicita();
  34.                                return 0;
  35.                }
  36.                printf("Wrong pass\n");
  37.                getchar();
  38.                return 1;
  39.        }
  40.        printf("Wrong pass\n");
  41.        getchar();
  42.        return 1;
  43. }
  44.  
  45. int comp(char *cadena)
  46. {
  47.        int i;
  48.        for(i=0;i<strlen(cadena);i++)
  49.        {
  50.                if(!((cadena[i]>='0' && cadena[i]<='9') || (cadena[i]>='A' && cadena[i]<='F')))
  51.                {
  52.                        return 1;
  53.                }
  54.        }
  55.        return 0;
  56. }
  57.  
  58. void felicita()
  59. {
  60.        printf("Registered\n");
  61.        getchar();
  62. }
  63.  

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.