fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_INPUT_LENGTH 50
  5. // Kunci rahasia yang telah di-XOR 0x77 (dibuat saat kompilasi)
  6. // Aslinya: "ADVANCED_RE_CHALLENGE"
  7. const char encrypted_key[] = "\x26\x31\x32\x35\x36\x37\x32\x35\x33\x34\x33\x37\x30\x32\x35\x37\x37\x32\x34\x37\x32";
  8. const int KEY_LENGTH = 21;
  9. const char MAGIC_BYTE = 0x77; // Kunci enkripsi (XOR key)
  10.  
  11. // Fungsi untuk mengenkripsi/mendekripsi string menggunakan XOR
  12. void simple_xor(char *data, int len, char key) {
  13. for (int i = 0; i < len; i++) {
  14. data[i] = data[i] ^ key;
  15. }
  16. }
  17.  
  18. // Fungsi pengecekan yang kompleks
  19. int check_serial(const char *input) {
  20. if (strlen(input) != KEY_LENGTH) {
  21. return 0; // Gagal jika panjang berbeda
  22. }
  23.  
  24. // Buat salinan input karena kita akan memodifikasinya
  25. char temp_input[MAX_INPUT_LENGTH];
  26. strncpy(temp_input, input, KEY_LENGTH);
  27. temp_input[KEY_LENGTH] = '\0'; // Pastikan null-terminated
  28.  
  29. // Langkah 1: Enkripsi input pengguna (teknik pengalihan perhatian)
  30. // Mahasiswa harus menyadari bahwa input mereka diubah
  31. simple_xor(temp_input, KEY_LENGTH, MAGIC_BYTE);
  32.  
  33. // Langkah 2: Perbandingan dengan kunci yang sudah terenkripsi
  34. // Perbandingan dilakukan pada hasil XOR, bukan pada kunci asli
  35. if (memcmp(temp_input, encrypted_key, KEY_LENGTH) == 0) {
  36. return 1; // Berhasil
  37. } else {
  38. return 0; // Gagal
  39. }
  40. }
  41.  
  42. int main() {
  43. char user_input[MAX_INPUT_LENGTH];
  44.  
  45. printf("--- Challenge Reversing Lanjutan ---\n");
  46. printf("Masukkan Serial Key (tepat %d karakter): ", KEY_LENGTH);
  47.  
  48. if (fgets(user_input, MAX_INPUT_LENGTH, stdin) != NULL) {
  49. size_t len = strlen(user_input);
  50. if (len > 0 && user_input[len - 1] == '\n') {
  51. user_input[len - 1] = '\0';
  52. }
  53.  
  54. if (check_serial(user_input)) {
  55. printf("\n[SUCCESS] Kode Lanjutan Ditembus!\n");
  56. // String FLAG disembunyikan di sini
  57. printf("FLAG: {XOR_IS_FUN_BUT_TRICKY}\n");
  58. } else {
  59. printf("\n[FAILURE] Serial Key salah. Coba lagi.\n");
  60. }
  61. }
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0s 5332KB
stdin
/*  Berechnung des Hamming-Abstandes zwischen zwei 128-Bit Werten in 	*/
/*	einer Textdatei. 													*/
/*  Die Werte müssen auf einer separaten Zeile gespeichert sein			*/
/* 																		*/
/*	Erstellt: 17.5.2010													*/
/*  Autor: Thomas Scheffler												*/

#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE 32

unsigned Hamdist(unsigned x, unsigned y)
{
  unsigned dist = 0, val = x ^ y;
 
  // Count the number of set bits
  while(val)
  {
    ++dist; 
    val &= val - 1;
  }
 
  return dist;
}



int main (void)
{
	char hex;
	int i;
	int a[ARRAY_SIZE];
	int b[ARRAY_SIZE];
	int hamDist = 0;
	FILE* fp;
	
	//Arrays mit 0 initialisieren
	for (i = 0; i < ARRAY_SIZE; ++i)
	{
  		a[i] = 0;
  		b[i] = 0;
	}

	
	fp = fopen("hex.txt","r");
	if (fp == NULL) 
	{
		printf("Die Datei hex.txt wurde nicht gefunden!");
		exit(EXIT_FAILURE);
	}

	i=0;
	printf("1.Zeile einlesen.\n");

 	while((hex=fgetc(fp))!='\n' && hex != EOF)
    {
        a[i]=strtol(&hex,0,16);
		i++;
    }
	i=0;
	printf("2.Zeile einlesen.\n");

 	while((hex=fgetc(fp))!='\n' && hex != EOF)
    {
    	b[i]=strtol(&hex,0,16);
        i++;
    }
	fclose(fp);

	printf("Hamming-Abweichung pro Nibble:\n");
	for (i = 0; i < ARRAY_SIZE; ++i)
	{
		printf ("%i\t%i\t%i\n",a[i],b[i],Hamdist(a[i],b[i]));
		hamDist += Hamdist(a[i],b[i]);
	}
	printf ("\nHamming-Abweichung der Hash-Werte:%d\n",hamDist);
}

stdout
--- Challenge Reversing Lanjutan ---
Masukkan Serial Key (tepat 21 karakter): 
[FAILURE] Serial Key salah. Coba lagi.