ALQ{f1bon4cc1_d0_4rkham}
A captura dessa flag consistia em conseguir burlar o sistema de criptografia. Objetivo desse desafio foi conseguir descriptografar um arquivo que foi passado por um arquivo compilado em C disponível publicamente. Esse é o algoritmo de criptografia:
// cripto do arkham - 2023
// use uma string de no maximo 25 caracteres para criptografar
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])
{
int count, x, y, z, index, t, r;
FILE *a;
srand(time(NULL));
if(argc != 2)
{
printf("\nUse: ./ark-cripto [secret_message]\n");
printf("Examples:\n");
printf("./ark-cripto hello_arkham!\n\n");
return 0;
}
a = fopen("output-ark-cripto2.txt", "w");
t = strlen(argv[1]);
x = 34;
y = 55;
index = 0;
for(count = 0; count < 10000000; count++)
{
z = x + y;
r = rand() % 127;
if((count == z) && (index < t))
{
printf("%d \n", count);
fprintf(a, "%c", argv[1][index]);
index++;
x = y;
y = z;
}
else
{
fprintf(a, "%c", r);
}
}
fclose(a);
return 0;
}
O problema desse método de criptografia é que a mensagem criptografada sempre vai assumir a mesma posição, sem nenhum tipo de variação. Para descriptografar, basta acessar as mesmas posições nos arquivos, seguindo a sequência de Fibonnaci. Então, fazendo um simples script no Python, temos:
x = 34
y = 55
count = 0
possible_anwser = ""
with open("./output-ark-cripto.txt", "rb") as file:
while byte := file.read(1): # Ler um byte de cada vez
z = x + y
if count == z:
possible_anwser += byte.decode('utf-8') # Decodificar o byte e ignorar erros
x = y
y = z
count += 1
print(possible_anwser)
Importante
É importante ler como binários para evitar a interpretação ambígua de caracteres especiais, já que no algoritmo de criptografia o caractere impresso tem chance de ser especial.