#include <stdio.h>
#include <string.h>
#define MAX_INPUT_LENGTH 50
// Kunci rahasia yang telah di-XOR 0x77 (dibuat saat kompilasi)
// Aslinya: "ADVANCED_RE_CHALLENGE"
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 " ;
const int KEY_LENGTH = 21 ;
const char MAGIC_BYTE = 0x77 ; // Kunci enkripsi (XOR key)
// Fungsi untuk mengenkripsi/mendekripsi string menggunakan XOR
void simple_xor( char * data, int len, char key) {
for ( int i = 0 ; i < len; i++ ) {
data[ i] = data[ i] ^ key;
}
}
// Fungsi pengecekan yang kompleks
int check_serial( const char * input) {
if ( strlen ( input
) != KEY_LENGTH
) { return 0 ; // Gagal jika panjang berbeda
}
// Buat salinan input karena kita akan memodifikasinya
char temp_input[ MAX_INPUT_LENGTH] ;
strncpy ( temp_input
, input
, KEY_LENGTH
) ; temp_input[ KEY_LENGTH] = '\0 ' ; // Pastikan null-terminated
// Langkah 1: Enkripsi input pengguna (teknik pengalihan perhatian)
// Mahasiswa harus menyadari bahwa input mereka diubah
simple_xor( temp_input, KEY_LENGTH, MAGIC_BYTE) ;
// Langkah 2: Perbandingan dengan kunci yang sudah terenkripsi
// Perbandingan dilakukan pada hasil XOR, bukan pada kunci asli
if ( memcmp ( temp_input
, encrypted_key
, KEY_LENGTH
) == 0 ) { return 1 ; // Berhasil
} else {
return 0 ; // Gagal
}
}
int main( ) {
char user_input[ MAX_INPUT_LENGTH] ;
printf ( "--- Challenge Reversing Lanjutan ---\n " ) ; printf ( "Masukkan Serial Key (tepat %d karakter): " , KEY_LENGTH
) ;
if ( fgets ( user_input
, MAX_INPUT_LENGTH
, stdin
) != NULL
) { size_t len
= strlen ( user_input
) ; if ( len > 0 && user_input[ len - 1 ] == '\n ' ) {
user_input[ len - 1 ] = '\0 ' ;
}
if ( check_serial( user_input) ) {
printf ( "\n [SUCCESS] Kode Lanjutan Ditembus!\n " ) ; // String FLAG disembunyikan di sini
printf ( "FLAG: {XOR_IS_FUN_BUT_TRICKY}\n " ) ; } else {
printf ( "\n [FAILURE] Serial Key salah. Coba lagi.\n " ) ; }
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYX0lOUFVUX0xFTkdUSCA1MAovLyBLdW5jaSByYWhhc2lhIHlhbmcgdGVsYWggZGktWE9SIDB4NzcgKGRpYnVhdCBzYWF0IGtvbXBpbGFzaSkKLy8gQXNsaW55YTogIkFEVkFOQ0VEX1JFX0NIQUxMRU5HRSIKY29uc3QgY2hhciBlbmNyeXB0ZWRfa2V5W10gPSAiXHgyNlx4MzFceDMyXHgzNVx4MzZceDM3XHgzMlx4MzVceDMzXHgzNFx4MzNceDM3XHgzMFx4MzJceDM1XHgzN1x4MzdceDMyXHgzNFx4MzdceDMyIjsKY29uc3QgaW50IEtFWV9MRU5HVEggPSAyMTsKY29uc3QgY2hhciBNQUdJQ19CWVRFID0gMHg3NzsgLy8gS3VuY2kgZW5rcmlwc2kgKFhPUiBrZXkpCgovLyBGdW5nc2kgdW50dWsgbWVuZ2Vua3JpcHNpL21lbmRla3JpcHNpIHN0cmluZyBtZW5nZ3VuYWthbiBYT1IKdm9pZCBzaW1wbGVfeG9yKGNoYXIgKmRhdGEsIGludCBsZW4sIGNoYXIga2V5KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgZGF0YVtpXSA9IGRhdGFbaV0gXiBrZXk7CiAgICB9Cn0KCi8vIEZ1bmdzaSBwZW5nZWNla2FuIHlhbmcga29tcGxla3MKaW50IGNoZWNrX3NlcmlhbChjb25zdCBjaGFyICppbnB1dCkgewogICAgaWYgKHN0cmxlbihpbnB1dCkgIT0gS0VZX0xFTkdUSCkgewogICAgICAgIHJldHVybiAwOyAvLyBHYWdhbCBqaWthIHBhbmphbmcgYmVyYmVkYQogICAgfQoKICAgIC8vIEJ1YXQgc2FsaW5hbiBpbnB1dCBrYXJlbmEga2l0YSBha2FuIG1lbW9kaWZpa2FzaW55YQogICAgY2hhciB0ZW1wX2lucHV0W01BWF9JTlBVVF9MRU5HVEhdOwogICAgc3RybmNweSh0ZW1wX2lucHV0LCBpbnB1dCwgS0VZX0xFTkdUSCk7CiAgICB0ZW1wX2lucHV0W0tFWV9MRU5HVEhdID0gJ1wwJzsgLy8gUGFzdGlrYW4gbnVsbC10ZXJtaW5hdGVkCgogICAgLy8gTGFuZ2thaCAxOiBFbmtyaXBzaSBpbnB1dCBwZW5nZ3VuYSAodGVrbmlrIHBlbmdhbGloYW4gcGVyaGF0aWFuKQogICAgLy8gTWFoYXNpc3dhIGhhcnVzIG1lbnlhZGFyaSBiYWh3YSBpbnB1dCBtZXJla2EgZGl1YmFoCiAgICBzaW1wbGVfeG9yKHRlbXBfaW5wdXQsIEtFWV9MRU5HVEgsIE1BR0lDX0JZVEUpOwoKICAgIC8vIExhbmdrYWggMjogUGVyYmFuZGluZ2FuIGRlbmdhbiBrdW5jaSB5YW5nIHN1ZGFoIHRlcmVua3JpcHNpCiAgICAvLyBQZXJiYW5kaW5nYW4gZGlsYWt1a2FuIHBhZGEgaGFzaWwgWE9SLCBidWthbiBwYWRhIGt1bmNpIGFzbGkKICAgIGlmIChtZW1jbXAodGVtcF9pbnB1dCwgZW5jcnlwdGVkX2tleSwgS0VZX0xFTkdUSCkgPT0gMCkgewogICAgICAgIHJldHVybiAxOyAvLyBCZXJoYXNpbAogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gMDsgLy8gR2FnYWwKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBjaGFyIHVzZXJfaW5wdXRbTUFYX0lOUFVUX0xFTkdUSF07CgogICAgcHJpbnRmKCItLS0gQ2hhbGxlbmdlIFJldmVyc2luZyBMYW5qdXRhbiAtLS1cbiIpOwogICAgcHJpbnRmKCJNYXN1a2thbiBTZXJpYWwgS2V5ICh0ZXBhdCAlZCBrYXJha3Rlcik6ICIsIEtFWV9MRU5HVEgpOwoKICAgIGlmIChmZ2V0cyh1c2VyX2lucHV0LCBNQVhfSU5QVVRfTEVOR1RILCBzdGRpbikgIT0gTlVMTCkgewogICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXNlcl9pbnB1dCk7CiAgICAgICAgaWYgKGxlbiA+IDAgJiYgdXNlcl9pbnB1dFtsZW4gLSAxXSA9PSAnXG4nKSB7CiAgICAgICAgICAgIHVzZXJfaW5wdXRbbGVuIC0gMV0gPSAnXDAnOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNoZWNrX3NlcmlhbCh1c2VyX2lucHV0KSkgewogICAgICAgICAgICBwcmludGYoIlxuW1NVQ0NFU1NdIEtvZGUgTGFuanV0YW4gRGl0ZW1idXMhXG4iKTsKICAgICAgICAgICAgLy8gU3RyaW5nIEZMQUcgZGlzZW1idW55aWthbiBkaSBzaW5pCiAgICAgICAgICAgIHByaW50ZigiRkxBRzoge1hPUl9JU19GVU5fQlVUX1RSSUNLWX1cbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ZigiXG5bRkFJTFVSRV0gU2VyaWFsIEtleSBzYWxhaC4gQ29iYSBsYWdpLlxuIik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9
stdin
LyogIEJlcmVjaG51bmcgZGVzIEhhbW1pbmctQWJzdGFuZGVzIHp3aXNjaGVuIHp3ZWkgMTI4LUJpdCBXZXJ0ZW4gaW4gCSovCi8qCWVpbmVyIFRleHRkYXRlaS4gCQkJCQkJCQkJCQkJCSovCi8qICBEaWUgV2VydGUgbSZ1dW1sO3NzZW4gYXVmIGVpbmVyIHNlcGFyYXRlbiBaZWlsZSBnZXNwZWljaGVydCBzZWluCQkJKi8KLyogCQkJCQkJCQkJCQkJCQkJCQkJKi8KLyoJRXJzdGVsbHQ6IDE3LjUuMjAxMAkJCQkJCQkJCQkJCQkqLwovKiAgQXV0b3I6IFRob21hcyBTY2hlZmZsZXIJCQkJCQkJCQkJCQkqLwoKI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKCiNkZWZpbmUgQVJSQVlfU0laRSAzMgoKdW5zaWduZWQgSGFtZGlzdCh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQp7CiAgdW5zaWduZWQgZGlzdCA9IDAsIHZhbCA9IHggXiB5OwogCiAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBzZXQgYml0cwogIHdoaWxlKHZhbCkKICB7CiAgICArK2Rpc3Q7IAogICAgdmFsICZhbXA7PSB2YWwgLSAxOwogIH0KIAogIHJldHVybiBkaXN0Owp9CgoKCmludCBtYWluICh2b2lkKQp7CgljaGFyIGhleDsKCWludCBpOwoJaW50IGFbQVJSQVlfU0laRV07CglpbnQgYltBUlJBWV9TSVpFXTsKCWludCBoYW1EaXN0ID0gMDsKCUZJTEUqIGZwOwoJCgkvL0FycmF5cyBtaXQgMCBpbml0aWFsaXNpZXJlbgoJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkU7ICsraSkKCXsKICAJCWFbaV0gPSAwOwogIAkJYltpXSA9IDA7Cgl9CgoJCglmcCA9IGZvcGVuKCZxdW90O2hleC50eHQmcXVvdDssJnF1b3Q7ciZxdW90Oyk7CglpZiAoZnAgPT0gTlVMTCkgCgl7CgkJcHJpbnRmKCZxdW90O0RpZSBEYXRlaSBoZXgudHh0IHd1cmRlIG5pY2h0IGdlZnVuZGVuISZxdW90Oyk7CgkJZXhpdChFWElUX0ZBSUxVUkUpOwoJfQoKCWk9MDsKCXByaW50ZigmcXVvdDsxLlplaWxlIGVpbmxlc2VuLlxuJnF1b3Q7KTsKCiAJd2hpbGUoKGhleD1mZ2V0YyhmcCkpIT0nXG4nICZhbXA7JmFtcDsgaGV4ICE9IEVPRikKICAgIHsKICAgICAgICBhW2ldPXN0cnRvbCgmYW1wO2hleCwwLDE2KTsKCQlpKys7CiAgICB9CglpPTA7CglwcmludGYoJnF1b3Q7Mi5aZWlsZSBlaW5sZXNlbi5cbiZxdW90Oyk7CgogCXdoaWxlKChoZXg9ZmdldGMoZnApKSE9J1xuJyAmYW1wOyZhbXA7IGhleCAhPSBFT0YpCiAgICB7CiAgICAJYltpXT1zdHJ0b2woJmFtcDtoZXgsMCwxNik7CiAgICAgICAgaSsrOwogICAgfQoJZmNsb3NlKGZwKTsKCglwcmludGYoJnF1b3Q7SGFtbWluZy1BYndlaWNodW5nIHBybyBOaWJibGU6XG4mcXVvdDspOwoJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkU7ICsraSkKCXsKCQlwcmludGYgKCZxdW90OyVpXHQlaVx0JWlcbiZxdW90OyxhW2ldLGJbaV0sSGFtZGlzdChhW2ldLGJbaV0pKTsKCQloYW1EaXN0ICs9IEhhbWRpc3QoYVtpXSxiW2ldKTsKCX0KCXByaW50ZiAoJnF1b3Q7XG5IYW1taW5nLUFid2VpY2h1bmcgZGVyIEhhc2gtV2VydGU6JWRcbiZxdW90OyxoYW1EaXN0KTsKfQoK
/* 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);
}