Estoy tratando de resolver este ejercicio para la universidad. Tenemos que "crack" un programa, que falta un archivo de licencia que se requiere para iniciar el programa. Solo estamos trabajando con una cáscara de Linux.

Entonces, lo que ya he hecho es crear este archivo de licencia faltante. Es un .ini que incluye un titular de licencias y una clave de licencia. Lo único que estoy buscando ahora es la clave de licencia correcta. La tarea dice que deberíamos usar "Strace" y "Ltrace" para resolver este problema. Esto es lo que obtengo como salida:

fopen("license.ini", "r")                                   =0x55c088307380

fgets("LicenseHolder=annabell.krause@ex"..., 4096, 0x55c088307380)  = 0x7ffe72450860

strncmp("LicenseKey=", "LicenseHolder=annabell.krause@ex"..., 11)   = 3

strncmp("LicenseHolder=", "LicenseHolder=annabell.krause@ex"..., 14)    = 0

sscanf(0x7ffe72450860, 0x55c08753c16b, 0x7ffe72450800, 0xffffc000)  = 1

fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0x7ffe72450860

strncmp("LicenseKey=", "LicenseKey=aoeklycf", 11)           = 0

sscanf(0x7ffe72450860, 0x55c08753c121, 0x7ffe72450840, 0xfffff800)  = 1

fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380)          = 0

memfrob(0x7ffe72450840, 8, 0, 0xfbad2498)                   = 0x7ffe72450840

strncmp("KEOAFSIL", "aoeklycf", 8)                          = -22

fwrite("ERROR: License key is invalid.\n", 1, 31, 0x7faeabe60680
ERROR: License key is invalid.
)                                   = 31

+++ exited (status 1) +++

Así que supongo que la respuesta se encuentra en algún lugar dentro de la función MEMFROB y STRNCMP al final. Pero no sé cuál es el siguiente paso.

-1
Kroonox 30 jun. 2019 a las 18:06

1 respuesta

La mejor respuesta

Veamos la Llamada de seguimiento de la biblioteca por llamada. La parte importante está en el paso 5.

Análisis

  1. abre el archivo

    fopen("license.ini", "r")                                   =0x55c088307380
    

    Abre el archivo de licencia.

  2. analizar el titular de la licencia

    fgets("LicenseHolder=annabell.krause@ex"..., 4096, 0x55c088307380)  = 0x7ffe72450860
    

    Lee una línea desde el archivo: LicenseHolder=annabell.krause@ex….

    strncmp("LicenseKey=", "LicenseHolder=annabell.krause@ex"..., 11)   = 3
    

    ¿Comienza la línea con LicenseKey=? El valor de retorno de 3 significa no, no lo hace.

    strncmp("LicenseHolder=", "LicenseHolder=annabell.krause@ex"..., 14)    = 0
    

    ¿Comienza la línea con LicenseHolder=? Sí, lo hace.

    sscanf(0x7ffe72450860, 0x55c08753c16b, 0x7ffe72450800, 0xffffc000)  = 1
    

    Desafortunadamente, LTRACE no ha desferido ninguna de las direcciones para mostrarnos los contenidos. Sabemos que 0x7ffe72450860 es la línea actual, por lo que presumiblemente está sacando la dirección de correo electrónico de la línea actual.

  3. analizar la clave de licencia

    fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0x7ffe72450860
    

    Lee otra línea: LicenseKey=aoeklycf.

    strncmp("LicenseKey=", "LicenseKey=aoeklycf", 11)           = 0
    

    ¿Comienza la línea con LicenseKey=? Sí, lo hace.

    sscanf(0x7ffe72450860, 0x55c08753c121, 0x7ffe72450840, 0xfffff800)  = 1
    

    Está analizando la línea actual. Presumiblemente, está extrayendo la clave de licencia que ingresó, aoeklycf y guardándola en una variable para comparación posterior contra la clave de licencia esperada. Algo como sscanf(line, "LicenseKey=%s", licenseKey);.

  4. final de archivo

    fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380)          = 0
    

    Intenta leer otra línea y hits EOF. Ignore el primer argumento, solo está mostrando lo que quedó en el búfer de la última llamada.

  5. Comparación de clave de licencia

    memfrob(0x7ffe72450840, 8, 0, 0xfbad2498)                   = 0x7ffe72450840
    

    "Encripta" 8 bytes de algún área de memoria mediante el anulación de cada byte con 42. Esto se puede revertir ejecutando memfrob() de nuevo. Puse "cifras" en citas aéreas porque apenas se puede llamar cifrado. Es solo un poco de ofuscación.

    Observe que 0x7ffe72450840 es la dirección de la sscanf() arriba. Es fobbitando la variable que llamé licenseKey arriba, la cadena LicenseKey= que se extrae del archivo de entrada.

    strncmp("KEOAFSIL", "aoeklycf", 8)                          = -22
    

    Esta es la línea de dinero. Compara los valores reales y esperados y falla.

  6. Mensaje de error

    fwrite("ERROR: License key is invalid.\n", 1, 31, 0x7faeabe60680)                                   = 31
    

    Se imprime un error.

Síntesis

Pero el autor no quiere que pueda ejecutar una búsqueda de cadena simple como strings ./program para sacar la clave de licencia del ejecutable. Para evitar que tenga que ingresar la versión Fobobbed de la clave de licencia en license.ini, no se encuentra la cadena RAW strings.

El código podría verse así:

char *expected = "aoeklycf";
char actual[BUFSIZE];

sscanf(line, "LicenseKey=%s", actual);
memfrob(actual);
if (strncmp(actual, expected, strlen(expected)) != 0) {
    error("ERROR: License key is invalid.\n");
}

¿Extruyó aoeklycf del programa? Si es así, se perdió el paso memfrob(). license.ini necesita enumerar la versión "cifrada" de la clave de licencia: KEOAFSIL.

4
John Kugelman 30 jun. 2019 a las 16:24