[KeygenMe] Matrix

Iniciado por mr.blood, Marzo 24, 2015, 02:48:04 PM

Tema anterior - Siguiente tema

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

Marzo 24, 2015, 02:48:04 PM Ultima modificación: Julio 11, 2015, 09:14:19 PM por Expermicid
Aquí os dejo un KeygenMe, espero que os guste. Está programado en C++ no sé que nivel de dificultad decir que tiene, para crackearlo será nivel 0, pero el reto es hacer un keygen :).

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

SaluDoS

user: peterpunk
pass: aaalmmppq

user undercode
pass: cddsstttt

No programo el keygen porque algunos users no podrían tener pass (ese es el motivo de que puse un pass para "underode" en lugar de "underc0de" o "UNDERC0DE"
Aunque el keygenme (yo lo llamaría bruteforceme) lo hace bastante lioso, en bucles multiplcando los caracteres del user con los caracteres del pass, al final se puede reducir a:
user y pass deben ser de 9 caracteres
suma de 1, 4 y 7 letras del user multiplicado por la suma de 3 primeras letras del pass
suma de 2, 5 y 8 letras del user multiplicado por la suma de las 3 letras del medio del pass
suma de 3, 6 y 9 letras del user multiplicado por la suma de las últimas 3 letras del pass
y la suma de los tres anteriores valores tiene que ser igual a 0x4CDFB (314875)

Ejemplo:
peterpunk ->
ascii(p) + ascii(e) + ascii(u) = 330
ascii(e) + ascii(r) + ascii(n) = 325
ascii(t) + ascii(p) + ascii(k) = 335
y ahora habría que buscar tres incógnitas tal que
330x + 325y + 335z = 314875
que sólo lograremos resolver por fuerza bruta
y obtendremos valores como estos (existen más posibilidades, éstos son los primeros que encuentro si empiezo a buscar a partir de la "a" minúscula):
x = 291, y = 326, z = 337
(330*291 + 325*326 + 335*337 = 314875)
Por último habría que trasladar esos resultados a caracteres.
Como ya he dicho, cada resultado es la suma de tres caracteres, así que por ejemplo, 326, podría ser "lmm" o "mlm" o "nnj" o lo que nos cuadre.

Por si a alguien le interesa, un pequeño bruteforce en masm32:
Código: php
include masm32rt.inc

.data
szTitulo db "Bruteforcer",0
szFormato db "User: %s",13,"Pass: %s",0

.data?
szUser db 10 dup (?)
szPass db 10 dup (?)
Buffer db 50 dup (?)
dwUser1 dd ?
dwUser2 dd ?
dwUser3 dd ?
dwPass1 dd ?
dwPass2 dd ?
dwPass3 dd ?

.code

start:
    mov esi, offset szUser
    mov dwUser1, 291 ;"aaa"
    .while dwUser1 <= 366 ;"zzz"
        mov dwUser2, 291
        .while dwUser2 <= 366
            mov dwUser3, 291
            .while dwUser3 <= 366
                mov dwPass1, 291
                .while dwPass1 <= 366
                    mov dwPass2, 291
                    .while dwPass2 <= 366
                        mov dwPass3, 291
                        .while dwPass3 <= 366
                            mov eax, dwPass3
                            imul eax, dwUser3
                            mov edx, eax
                            mov eax, dwPass2
                            imul eax, dwUser2
                            add edx, eax
                            mov eax, dwPass1
                            imul eax, dwUser1
                            add edx, eax
                            .if edx == 4cdfbh
                                mov ecx, 3
                                xor ebx, ebx
                                .repeat
                                    lea eax, [offset dwUser1 + ebx*4]
                                    mov eax, [eax]
                                    cdq
                                    div ecx
                                    mov [esi + ebx], al
                                    mov [esi + ebx + 3], al
                                    mov [esi + ebx + 6], al
                                    .if dl == 2
                                        inc byte ptr [esi + ebx + 3]
                                        inc byte ptr [esi + ebx + 6]
                                    .elseif dl == 1
                                        inc byte ptr [esi + ebx + 6]
                                    .endif
                                    inc ebx
                                .until ebx == 3
                                mov edi, offset szPass
                                xor ebx, ebx
                                .repeat
                                    lea eax, [offset dwPass1 + ebx*4]
                                    mov eax, [eax]
                                    cdq
                                    div ecx
                                    mov [edi], al
                                    mov [edi + 1], al
                                    mov [edi + 2], al
                                    .if dl == 2
                                        inc byte ptr [edi + 1]
                                        inc byte ptr [edi + 2]
                                    .elseif dl == 1
                                        inc byte ptr [edi + 2]
                                    .endif
                                    add edi, 3
                                    inc ebx
                                .until ebx == 3
                                invoke wsprintf, addr Buffer, addr szFormato, esi, addr szPass
                                invoke MessageBox, NULL, addr Buffer, addr szTitulo, MB_OKCANCEL
                                .if eax == IDCANCEL
                                    jmp @Sair
                                .endif
                            .endif
                            inc dwPass3
                        .endw
                        inc dwPass2
                    .endw
                    inc dwPass1
                .endw
                inc dwUser3
            .endw
            inc dwUser2
        .endw
        inc dwUser1
    .endw
@Sair:
    invoke ExitProcess, eax

end start


Saludos.

Lo crackee y reconocí la condición de los 9 caracteres y que se finalizaba comparando el resultado con 0x4CDFB, sin embargo estuve dándole varias vueltas al proceso para captar el algoritmo matematico pero no lo logre, creo que me falta bastante teoría para deducir la matematica a partir del desamblado.

bueno me dio duro este keygenme  :'( y yo que me creia que ya iba aprendiendo , creo que  aun me falta mucho por aprender , ojala alguien se anime a hacer un tuto de este gran keygenme  ;)

Agosto 11, 2018, 02:32:42 AM #4 Ultima modificación: Agosto 11, 2018, 02:37:45 AM por apuromafo
es un verdadero bruteforceme, yo con pillar un serial valido quedo conforme, de paso coloco 5 de referencias:

en forma Práctica, asumiría que cualquier nombre minúsculas sin numeros, debería tener solución (bf)
Founded on 32064 attempts
username => apuromafo
password => oqtcqljjg

Founded on 7053 attempts
username => apuromafo
password => noabvezvb

Founded on 21767 attempts
username => apuromafo
password => lqacvdskt

Founded on 19950 attempts
username => apuromafo
password => xwvjfcpag

Founded on 13773 attempts
username => apuromafo
password => shhnslbth

y más
password => fgejzvhml
password => hnmrwddsg
password => crnvsdbbz
password => xweiincph
password => zwtcbnhfj
password => yfpjaeyjl
password => vehdxqiof
password => aicwmfexx
password => kuchxmbfv
password => ecesdsttm
password => daybybsqn
password => yhbhupfjn
password => iftatxqdi
password => pamjlghqy
password => slulfnnbk
password => tkzqxgbcb
password => wdygaxodh
password => mncqkauxe
password => nlidsvbfv
password => iperefxcw



source del keygen por @rextco

user y pass deben ser de 9 caracteres
suma de 1, 4 y 7 letras del user multiplicado por la suma de 3 primeras letras del pass
suma de 2, 5 y 8 letras del user multiplicado por la suma de las 3 letras del medio del pass
suma de 3, 6 y 9 letras del user multiplicado por la suma de las últimas 3 letras del pass
y la suma de los tres anteriores valores tiene que ser igual a 0x4CDFB (314875)



Código: php
# Python 2.7 x86
# Bruteforce solution by @rextco, credits for analysis to @Bozwkd
from __future__ import print_function
import numpy as np
import string
import sys


# Just print array bytes on string way
def print_string_from_matrix(matrix_):
    for byte in np.reshape(matrix_, 9):
        print("%c" % byte, end='')


# Constant
SHAPE = (3, 3)  # size for matrix
TARGET = 0x4CDFB

# pool = "0123456789" + string.ascii_lowercase
seed = string.ascii_lowercase
# print(string.printable)
# print(seed)
# sys.exit()

# make seed list for numpy.random.choice
# seed_list = []
# for c in seed:
#    seed_list.append(ord(c))

# map(function_to_apply, string)
seed_list = list(map(ord, seed))
print("seed_list = %s" % seed_list)
# sys.exit()

username = "apuromafo"
username = list(map(ord, username))
# print(username, len(username))

matrix_username = np.reshape(username, SHAPE)
# print(matrix_username, matrix_username.sum())
# sys.exit()
matrix_password = np.empty(SHAPE)
matrix_product = np.empty(SHAPE)

solutions_number = 0
while solutions_number < 5:
    check = 0
    attempts = 0    # for debug
    while check != TARGET and attempts < (1 << 18):
        # vector_username = np.random.choice(seed_list, 9)
        # matrix_username = np.reshape(np.random.choice(seed_list, 9), SHAPE)
        matrix_password = np.reshape(np.random.choice(seed_list, 9), SHAPE)

        matrix_product = np.matmul(matrix_username, matrix_password)
        check = matrix_product.sum()
        attempts += 1
        # print("numpy.matrix.sum = 0x%x" % matrix_product.sum())

    # sys.exit()

    # print numpy values in hex
    # np.set_printoptions(formatter={'int': lambda x: hex(int(x))})
    print("\n\nFounded on %d attempts" % attempts, end="")
    print("\nusername => ", end="")
    print_string_from_matrix(matrix_username)

    print("\npassword => ", end="")
    print_string_from_matrix(matrix_password)
    solutions_number += 1








Link para ejecución del keygen por si lo quieren ver
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Saludos Apuromafo
Ando retirado, pero cada cierto tiempo visito los foros, al minuto estoy bien ;)