Hidden Cipher 2 writeup

Descripción

The flag is right in front of you… kind of. You just need to solve a basic math problem to see it. But to get the real flag, you’ll have to understand how that math answer is used. You can download the program files here.

Hidden Cipher 2 solución

Al descargarnos el archivo veremos que es un .zip. Lo descomprimiremos:

unzip hiddencipher2.zip

Al ejecutarlo, nos pedirá realizar una operación matemática y nos dará la flag codificada si la realizamos correctamente:

Analizaremos el código del programa con ghidra:

ghidra

El código importante de main será el siguiente:

...
  local_1c = generate_math_question(&local_29,&local_28,&local_24);
...

    if (local_1c == local_20) {
      local_18 = read_flag_file("flag.txt");
      if (local_18 == (void *)0x0) {
        uVar3 = 1;
      }
...
      else {
        encode_flag((long)local_18,local_1c);
        free(local_18);
        uVar3 = 0;
      }
...
    }

La función ‘encode_flag()’ toma como parámetros el contenido del archivo flag.txt (local_18) y la operación matemática (local_lc). Si damos doble click a ella podremos ver su contenido:

void encode_flag(long param_1,int param_2)

{
  int local_c;
  
  puts("Encoded flag values:");
  for (local_c = 0; *(char *)(param_1 + local_c) != '\0'; local_c = local_c + 1) {
    printf("%d",*(char *)(param_1 + local_c) * param_2);
    if (*(char *)(param_1 + (long)local_c + 1) != '\0') {
      printf(", ");
    }
  }
  putchar(10);
  return;
}

Para cada letra de la flag, esta función la multiplica su valor ASCII por el número de la operación matemática. Haremos un código en python que haga el proceso inverso:

Nota: Aunque pueda parecer que esté sumando el iterador (param_1 + local_c), lo que está haciendo es sumar un entero al puntero de dirección de memoria, para poder iterar a lo largo de la cadena de caracteres. Es el contenido de este puntero el que se multiplica por param_2. Samebos que estamos tratando con un puntero por el (char *).

number=13
codedflag=[1456, 1365, 1287, 1443, 871, 1092, 910, 1599, 1326, 1261, 1391, 1313, 1235, 1326, 1404, 1261, 1339, 1625]
decodedflag = []

for i in range(0, len(codedflag)):
    decodedflag.append(chr(codedflag[i] // number))

print("".join(decodedflag))

Consiguiendo así la flag de prueba:

Lanzaremos ahora la instancia, cambiaremos los valores obtenidos en el código y obtendremos la flag, completando así el CTF.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *