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
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!
Cita de: mr.blood en 13 Marzo 2013, 15:04 PM
Los Keygen por privado por favor.
:huh:
Keygen en python:
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!
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
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...
Era por que durara mas el reto xD. En unos dias (sobre el Domingo) publico el codigo en este mismo post.
Sa1uDoS
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
Bueno, como nadie mas se anima posteo el codigo.
Tuve que retocar la PE Section y cifrar la funcion felicita().
Para compilar fasm funcion.asm
gcc crackme.c funcion.obj -o crackme.exe
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.
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.