00001XpgeLtfv-dY.es.srt

Este video es una sesión de reverse engineering de un binario compilado en C++ que implementa una clase con tres objetos instanciados.

Estructura analizada:

La clase MyClass tiene campos internos: user (string), password (string), stream2 (string), y un flag. Se crean tres objetos (obj1, obj2, obj3) de esa misma clase, cada uno con sus propios valores de user y password.

Operaciones sobre los objetos:

Sobre obj1 y obj2 se ejecuta una función que modifica el password: le suma la constante 5467 y luego le suma el size del user. El compilador optimizó esto diferente en cada caso: en obj1 llama a las funciones suma_const y suma_size, en obj2 inlinea la suma de la constante y solo llama a suma_size. En obj3 directamente no ejecuta esa operación.

Función chequeo (se ejecuta sobre los tres objetos):

  1. Convierte user a entero usando stoi. Si falla → imprime “me parece que falló”.
  2. Chequea que user_size > 6.
  3. Calcula una variable global zoom acumulando: zoom += user_int XOR 0x5436'77.
  4. Compara que password_int == temp (donde temp se derive del password transformado).
  5. Si el objeto es obj3, escribe "genial" en stream2; en los otros permanece "malísimo".
  6. Setea flag = 1 si las condiciones pasan, flag = 0 si no.

Condiciones finales (el “keygen”):

  • flag de obj1 y obj2 deben ser 1.
  • zoom acumulado debe ser igual a un valor hardcoded.
  • Si todo pasa, imprime "genial" usando el stream2 de obj3.

Keygen desarrollado:

El presentador despeja matemáticamente las ecuaciones: dado user1 y user2 como entrada, calcula el password correcto para cada uno, y luego calcula user3 y password3 automáticamente para que la sumatoria de zoom cuadre con el valor esperado. También valida que el len del user3 resultante sea >= 6 y positivo.

Todo fue analizado en un disassembler, renotando funciones en la vtable de MyClass y editando las firmas de las funciones para revelar el this pointer (MyClass*) correctamente.