Alquymia


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)