Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - karmany

#21
Bueno, para que la gente se anime a estudiar el Crackme me he propuesto analizarlo y crear un sencillo Keygen.
Para el keygen, aunque valen muchos caracteres, solo voy a usar números para evitar poner muchas condiciones en el código fuente. Pongo un enlace al final con el código fuente del keygen, el exe del mismo y una copia del crackme por si desapareciera en un futuro.

Carga el crackme en un depurador, yo lo hice con varios, pero para explicarlo lo hago con OllyDBGv2 en W10. Lo primero que llama la atención es que pesa muchísimo para el poco código que lleva, a ver si Flamer nos comenta el porqué.

Encontrar el código es sencillo buscando en las strings: botón dcho > search for > all referenced strings. Así se llega rápido al código.

Explicación del código
Código (asm) [Seleccionar]
00401700  cmp eax,0A
Nos indica que el serial tiene que tener exactamente 10 caracteres:
XXXXXXXXXX

El primer valor, voy a poner uno cualquiera: "1" = 31h
1XXXXXXXXX

Aquí trabaja con valor1 y valor6:
Código (asm) [Seleccionar]
CPU Disasm
Address   Hex dump          Command                                  Comments
00401750  |.  83E8 60       sub eax,60
00401753  |.  8945 DC       mov dword ptr ss:[ebp-24],eax
00401756  |.  837D DC 08    cmp dword ptr ss:[ebp-24],8
0040175A  |.  0F8E 62020000 jle 004019C2


En esa parte hace estas operaciones (todo en HEX):
valor6 + valor1 - 60 > 8; valor6 + 31h - 60h > 8h;
valor6 > 37h; Por lo tanto, valor6 = 38h ("8") o 39h.
1XXXX8XXXX

El valor 2 es un número aleatorio entre 0 y 9. Pongo por ej 7:
17XXX8XXXX

Un poco más adelante, empieza a realizar un montón de operaciones con los valores 1, 2, 6 desde 4017E3 hasta 401818. En este ejemplo, poniendo en el depurador el serial anterior, y BP en 401818, el resultado en eax de esas operaciones es: 6

Ahora volvemos a analizar un poco más arriba y verás que resta 30h al valor5 en 4017D7 y la comparación en 401821 compara el 6 del párrafo anterior con esto último:
valor5 = 6 + 30;
valor5 = 36h = "6"
17XX68XXXX

valor3 tiene que ser menor que 33h, mira en:
Código (asm) [Seleccionar]
CPU Disasm
Address   Hex dump          Command                                  Comments
00401861  |.  837D CC 32    cmp dword ptr ss:[ebp-34],32
00401865  |.  7F 73         jg short 004018DA

valor3 puede ser 32h("2"), 31h("1") o 30h("0")
172X68XXXX

valor4 tiene que ser mayor que 35h, mira en:
Código (asp) [Seleccionar]
CPU Disasm
Address   Hex dump          Command                                  Comments
00401867  |.  837D C8 35    cmp dword ptr ss:[ebp-38],35
0040186B  |.  7E 6D         jle short 004018DA

valor4 puede ser 36h, 37h, 38h o 39h.
172668XXXX

Y los 4 últimos caracteres pueden ser cualquier valor:
172668FORO

Dejo el código fuente que he realizado para el keygen, en Visual C++ 2019:
Código (cpp) [Seleccionar]
// Keygen Loki-Mouse.cpp
//

#include <iostream>
#include<time.h>
#include <sstream>

using namespace std;

int codigo_asm(int num1, int num2)
{
int resultado;
_asm
{
mov eax, num1
mov edx, num2
imul edx
sar edx, 2
mov eax, num1
sar eax, 0x1F
sub edx, eax
mov num2, edx
shl edx, 2
add edx, num2
add edx, edx
mov eax, num1
sub eax, edx
add eax, 0x30

mov resultado, eax
}
       return resultado;
}

int main()
{
int numHex = 0x00;
int hexCaracter[11] = {};
string caracter[11] = {};

srand(time(NULL)); //Inicializa números aleatorios

cout << "Keygen Crackme Loki-Mouse\n==========================\n\n";

cin.clear();
cout << "Para generar autom\240ticamente un serial v\240lido, pulsa una tecla...";
cin.ignore();

// El serial tiene que tener exactamente 10 caracteres

// ----------------
// Caracteres 1 y 6
// ----------------

// El carácter 1 va a ser un número aleatorio entre el 0(30hex) y 9(39hex):
hexCaracter[1] = 0x30 + rand() % (10);

// El carácter 6 responde a esta fórmula: c6 + c1 - 60 > 8; c6 > 68 - c1;
hexCaracter[6] = 0x69 - hexCaracter[1]; // Este es el primer valor válido
hexCaracter[0] = 0x39 - hexCaracter[6]; //Número de valores también válidos hasta el 9 (39h)
if (hexCaracter[0] != 0)
{
hexCaracter[6] = hexCaracter[6] + rand() % hexCaracter[0]; //Calcula aleatoriamente un valor válido entre todos los posibles.
}

// ----------
// Caracter 2
// ----------
// Un número aleatorio entre 0 y 9
hexCaracter[2] = 0x30 + rand() % (10);

// -----------------------------------------
// Realiza operaciones en ASM con C1, C2, C6
// -----------------------------------------
hexCaracter[0] = hexCaracter[2] + hexCaracter[1] + hexCaracter[6] - 0x90;


// ----------
// Caracter 5
// ----------
hexCaracter[5] = codigo_asm(hexCaracter[0], 0x66666667);

// ----------
// Caracter 3
// ----------
// Tiene que ser < 33h
hexCaracter[3] = 0x30 + rand() % (2);

// ----------
// Caracter 4
// ----------
// Tiene que ser > 35h
hexCaracter[4] = 0x36 + rand() % (3);

// --------------------
// Caracter 7, 8, 9, 10
// --------------------
// Cualquiera, yo voy a usar solo números, pero vale cualquier otro carácter
for (int i = 7; i < 11; i++)
{
hexCaracter[i] = 0x30 + rand() % (10);
}

        // Convertir números en cadena de texto y mostrarlos en pantalla
for (int i = 1; i < 11; i++)
{
caracter[i] = hexCaracter[i];
        cout << caracter[i];
}

cout << "\n";
system("pause");
return 0;
}


Y aquí la descarga:
Descargar Keygen desde Mega

Muchas gracias Flamer por el reto
#22
Como dice .:UND3R:. tienes que mostrarnos tus avances, tus archivos hacen saltar muchos antivirus y un/a usuario/a ha reportado este hilo.
Si no muestras tus avances, en un tiempo tendremos que eliminar tus descargas por posible malware.
#23
Ingeniería Inversa / Re: KeyGenME fary - v1.0
13 Enero 2019, 22:43 PM
¡¡Excelente trabajo Geovane!!
Tu punto de vista ha sido muy instructivo e interesante.

Gracias a tu idea se me ha ocurrido lo siguiente que no se si se podrá generalizar para otros caracteres o tamaños de serial.

Partimos del último carácter que me invento: 8 que es 38hex
Inicio: F6C53333

Código (cpp) [Seleccionar]
F6C53333 - 38   = F6C532FB; //38hex es el carácter 8
ROL F6C532FB, D = A65F7ED8

Y ahora voy restanto 7/8 bits como tu mencionas:
A65F7ED8 - 58   = A65F7E80; //58hex es el caracter X
ROL A65F7E80, D = EFD014CB
EFD014CB - 4B   = EFD01480; //4Bhex es el caracter K
ROL EFD01480, D = 02901DFA
02901DFA - 7A   = 02901D80; //7Ahex es el caracter z
ROL 02901D80, D = 03B00052
03B00052 - 52   = 03B00000; // 52hex es el caracter R
ROL 00000076, D = 00000076
00000076 - 76   = 00000000; //76hex es el caracter v


Por lo tanto, el serial válido es vRzKX8

Un saludo
Good work!
#24
Ingeniería Inversa / Re: KeyGenME fary - v1.0
13 Enero 2019, 11:45 AM
Bueno, he creado este simple generador de claves para 6 caracteres, usando solo la zona 4B. Unicamente el usuario debe escribir el primer carácter de (20hex hasta 7Fhex) y el resto lo calcula el programa.
Para no usar registros EDI ni nada por el estilo, he escrito la fórmula en un Excel. Os lo pongo en descarga.


Descarga del Excel:
https://mega.nz/#!i5YwSYLI!koy5ybfMZG1Op0v7-Ui8c3NdNIsvjU5R2tQW_4pOfuQ

Un saludo.
No puedo dedicar nada más de tiempo a este keygen. Espero el keygen de Geovane, que es muy interesante lo que explicó.
#25
Ingeniería Inversa / Re: KeyGenME fary - v1.0
13 Enero 2019, 00:16 AM
La verdad que esta clase de retos te distrae de la tareas cotidianas, así que he decidido distraerme un poco y hacer un keygen (generador de claves) para todos los seriales SOLO de 6 caracteres. Este keygen no lo he querido programar (sería muy sencillo) y lo voy a hacer escrito para que todo el mundo sin conocimientos de programación pueda usarlo.

Solo he utilizado caracteres imprimibles desde el valor 20hex hasta el 7Fhex, los demás los he obviado.
¿Cómo lo he resuelto? Pues hice directamente en OllyDBG fuerza bruta, me fui a cenar y después de cenar estudié los resultados que el script me dejó en memoria, así que es un keygen post-estudio.

Empecemos.
1º CARÁCTER
El que el usuario quiera. Voy a poner, por ejemplo, la letra v que equivale a 76hex. Los guiones siguientes, aunque puedan valer, en este caso no sirven y los pongo únicamente para mostrar los caracteres pendientes.
v-----

Antes de continuar con los siguientes caracteres, es necesario saber que según el valor hex de este primer caracter, existen 3 zonas.
PRIMERA ZONA. ZONA 4A. Del valor 68h al 7Fh (a.i.)
SEGUNDA ZONA. ZONA 4B. Del valor 1Fh al 7Fh (a.i.)
TERCERA ZONA. ZONA 4C. Del valor 1Fh al 27h (a.i.)

Para que sea sencillo de entender, pongo el ejemplo de la letra v=76h. El valor 76h puede estar:
-En la zona 4A (Del 68h al 7Fh) y
-En la zona 4B (Del 1Fh al 7Fh) pero no puede estar en la zona 4C.

2º y 5º CARACTERES
Estos caracteres son siempre fijos y corresponden a las letras R y X. Por lo tanto, ya tenemos:
vR--X-

3º CARÁCTER
Solo puede ser o los dos puntos : o la letra zeta minúscula (z).
Solo hay una condición:
Si el primer carácter es par, el 3º carácter es la letra zeta minúscula (z), si no : .
Por lo tanto, el primer carácter es la v que equivale a 76hex y es par, así que el 3º carácter es una z. Ya tenemos:
vRz-X-

4º CARÁCTER
El 4º carácter corresponde con la Zona. Así que podemos tener 2 casos para ZONA 4A (J) y ZONA 4B (K).
vRzJX-
vRzKX-

6º Y ÚLTIMO CARÁCTER
Realizamos las operaciones de cifrado del serial hasta el último carácter, así:
PRIMER SERIAL: vRzJX-
v = 76h
R = 52h
z = 7Ah
J = 4Ah
X = 58h

Código (asm) [Seleccionar]
EDI = 0    ; EDI = 00000000h
ADD EDI, 76; EDI = 00000076h
ROR EDI, D ; EDI = 03B00000h
ADD EDI, 52; EDI = 03B00052h
ROR EDI, D ; EDI = 02901D80h
ADD EDI, 7A; EDI = 02901DFAh
ROR EDI, D ; EDI = EFD01480h
ADD EDI, 4A; EDI = EFD014CAh
ROR EDI, D ; EDI = A6577E80h
ADD EDI, 58; EDI = A6577ED8h
ROR EDI, D ; EDI = F6C532BBh


Y ahora tan sencillo como restar la semilla F6C53333 con ese valor:
F6C53333 - F6C532BB = 78hex
6º carácter = 78h (x), por lo tanto, primera contraseña válida:
vRzJXx

SEGUNDO SERIAL: vRzKX-
v = 76h
R = 52h
z = 7Ah
K = 4Bh
X = 58h

Código (asm) [Seleccionar]
EDI = 0    ; EDI = 00000000h
ADD EDI, 76; EDI = 00000076h
ROR EDI, D ; EDI = 03B00000h
ADD EDI, 52; EDI = 03B00052h
ROR EDI, D ; EDI = 02901D80h
ADD EDI, 7A; EDI = 02901DFAh
ROR EDI, D ; EDI = EFD01480h
ADD EDI, 4A; EDI = EFD014CBh
ROR EDI, D ; EDI = A65F7E80h
ADD EDI, 58; EDI = A65F7ED8h
ROR EDI, D ; EDI = F6C532FBh


F6C53333 - F6C532FB = 38hex = 8
Segundo serial válido: vRzKX8

Otro ejemplo rápido sin tanta explicación:
3-----
solo está en ZONA 4B: 3--K--
2 caracteres fijos: 3R-KX-
impar: 3R:KX-

F6C53333 - F6C532D9 = 5Ah = Z
Serial válido: 3R:KXZ
#26
Ingeniería Inversa / Re: KeyGenME fary - v1.0
10 Enero 2019, 13:39 PM
Cita de: fary en  9 Enero 2019, 20:10 PM
bruteforce, ¿No?,  yo probé  con 4 caracteres y no me saco ni una válida jajajaja :(


Yo probé ayer un código rápido por fuerza bruta y con 5 caracteres (estuvo un buen rato) tampoco encontró nada válido. No sé si se podrá estudiar bien la rutina e intentar acotar para encontrar seriales válidos. Para los que empiezan es muy entretenido e interesante...
#27
Cita de: Geovane en  9 Enero 2019, 06:56 AM

Si grabo todos los bytes del disco en cero, nada se recupera, ¿verdad?

...

"Hay que saber con qué datos sobreescribimos la información almacenada, no es lo mismo hacerlo todo con 0 o con 1. El 0 no significa que la carga electromagnética desaparezca completamente. Un adversario con los conocimientos y el equipamiento necesario podría llegar a reconstruir parte de la información gracias a técnicas que permiten distinguir entre si el dato era un 0 o un 1 convertido a 0"
"Las aplicaciones de borrado seguro utilizan como mínimo dos pasadas: una con datos semialeatorios y otra alternando bloques de ceros y unos". Esto lo dijo Jorge Soydelbierzo.

#28
Hola!!

Yo también lo he revisado y te felicito por tu trabajo. Es muy buen aporte para aprender y lo ¡has escrito directamente en ASM!
Good work! @Fary

PD. Por supuesto lo he guardado por si en un futuro desapareciera...
Cierto, el host es una M. Si consigo sacar tiempo intentaré subir aunque sea a Mega los crackmes que tengo de elhacker
#29
Según opiniones de profesionales de seguridad informática, con 2 "pisadas" de datos sería suficiente. Te voy a enlazar a un artículo muy interesante de hace dos años aproximadamente donde un informático "pisó" los datos de los discos duros exactamente 35 veces siguiendo el conocido pero ya obsoleto método Gutmann. TAmbién, al final del artículo, el experto menciona varias herramientas de borrado tanto para Mac o Windows...

https://www.lavanguardia.com/tecnologia/20160806/403712293181/metodo-gutmann-barcenas-disco-duro-pp-formatear-dos-pasadas.html

Un saludo.
#30
Cita de: FlyNDSkyGMFnD en  5 Enero 2019, 20:21 PM
Hola, quería compartir con ustedes un crackme que he programado en C/C++ que seguramente les va a gustar y los va a entretener un poco.
........

Muchas gracias por tu tiempo. Acabo de guardar tu crackme por si se necesitara en un futuro...