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: text
Saludos.
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:
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.