bitte "mal laufen lassen"



  • Hallo
    Ich brauche nur kurz mal eure Hilde.
    Ich habe ein Geocaching Rätsel mit diesem Code:

    de <stdlib.h>
    
    int main (int argc, char *argv[]) {
            const char cryptotext[] = "\xC8\x74\xD3\x36\x38\x10\xD0\x69\x78\x20\x3C\x0B\xC3\x74\xD7\x3E\x21\x04\xD0\x70\x62\x29\x38\x1E";
            int checksum[] = {1969107214, 1336920198, 1615768230};
            char password[12];
            int *password_int;
            int key[3];
            int num_correct;
            char c;
            int state;
            int lo;
            int hi;
            int test;
            int j;
    
            j = 0;
    
            while (j < 11) {
                    password[j] = fgetc (stdin);
    
                    if (password[j] == '\r') {
                            j--;
                    }
    
                    j++;
            }
    
            password[j] = '\0';
    
            password_int = (int *)password;
            num_correct = 0;
            j = 0;
    
            while (j < 3) {
                    state = password_int[j];
    
                    lo = state % 127773;
                    hi = state / 127773;
    
                    test = 16807 * lo - 2836 * hi;
    
                    if (test > 0) {
                            state = test;
                    } else {
                            state = test + 2147483647;
                    }
    
                    key[j] = state;
    
                    lo = state % 127773;
                    hi = state / 127773;
    
                    test = 16807 * lo - 2836 * hi;
    
                    if (test > 0) {
                            state = test;
                    } else {
                            state = test + 2147483647;
                    }
    
                    if (state == checksum[j]) {
                            num_correct++;
                    }
    
                    j++;
            }
    
            if (num_correct != 3) {
                    printf ("\nPasswort falsch!\n");
    
                    return EXIT_FAILURE;
            }
    
            j = 0;
    
            while (j < sizeof(cryptotext) - 1) {
                    c = ((char *)key)[j % 12] ^ cryptotext[j];
    
                    if (c == '\0') {
                            break;
                    }
    
                    fputc (c, stdout);
    
                    j++;
            }
    
            fputc ('\n', stdout);
    
            return EXIT_SUCCESS;
    }
    de <stdlib.h>
    
    int main (int argc, char *argv[]) {
            const char cryptotext[] = "\xC8\x74\xD3\x36\x38\x10\xD0\x69\x78\x20\x3C\x0B\xC3\x74\xD7\x3E\x21\x04\xD0\x70\x62\x29\x38\x1E";
            int checksum[] = {1969107214, 1336920198, 1615768230};
            char password[12];
            int *password_int;
            int key[3];
            int num_correct;
            char c;
            int state;
            int lo;
            int hi;
            int test;
            int j;
    
            j = 0;
    
            while (j < 11) {
                    password[j] = fgetc (stdin);
    
                    if (password[j] == '\r') {
                            j--;
                    }
    
                    j++;
            }
    
            password[j] = '\0';
    
            password_int = (int *)password;
            num_correct = 0;
            j = 0;
    
            while (j < 3) {
                    state = password_int[j];
    
                    lo = state % 127773;
                    hi = state / 127773;
    
                    test = 16807 * lo - 2836 * hi;
    
                    if (test > 0) {
                            state = test;
                    } else {
                            state = test + 2147483647;
                    }
    
                    key[j] = state;
    
                    lo = state % 127773;
                    hi = state / 127773;
    
                    test = 16807 * lo - 2836 * hi;
    
                    if (test > 0) {
                            state = test;
                    } else {
                            state = test + 2147483647;
                    }
    
                    if (state == checksum[j]) {
                            num_correct++;
                    }
    
                    j++;
            }
    
            if (num_correct != 3) {
                    printf ("\nPasswort falsch!\n");
    
                    return EXIT_FAILURE;
            }
    
            j = 0;
    
            while (j < sizeof(cryptotext) - 1) {
                    c = ((char *)key)[j % 12] ^ cryptotext[j];
    
                    if (c == '\0') {
                            break;
                    }
    
                    fputc (c, stdout);
    
                    j++;
            }
    
            fputc ('\n', stdout);
    
            return EXIT_SUCCESS;
    }
    

    mir sagt das nur das es C/C++ ist 🙂
    ich brauche auch keine Einführung in die Programmiersprache 🙂 nur ein "Programm" dazu bzw.
    was will mir der Code sagen.
    Vielen lieben Dank.
    Gruß Jo



  • Gib mal als Passwort "Geburtstag" ein. 😉
    Ausgabe:

    N 48 42.415 E 009 27.815
    

    Falls jemanden die Lösung interessiert:

    #include <stdlib.h> 
    #include <stdio.h> 
    
    //Check if a key leads to a correct checksum
    bool _checkChecksum(int checksum, int value)
    {
    	int state = value; 
    
    	int lo = state % 127773; 
    	int hi = state / 127773; 
    
    	int test = 16807 * lo - 2836 * hi; 
    
    	if (test > 0)
    		state = test; 
    	else
    		state = test + 2147483647; 
    
    	lo = state % 127773; 
    	hi = state / 127773; 
    
    	test = 16807 * lo - 2836 * hi; 
    
    	if (test > 0)
    		state = test; 
    	else
    		state = test + 2147483647; 
    
    	return state == checksum;
    }
    
    int _bruteforceChecksum(int checksum)
    {
    	//Walk over all possible values of i
    	for(int i=0;;i++)
    	{
    		if(_checkChecksum(checksum, i))
    			return i;
    	}
    	return 0;
    }
    
    //Get the Password
    void bruteForceAllChecksums()
    {
    	int checksum[] = {1969107214, 1336920198, 1615768230}; 
    	int checksumReversed[3]; //={1969382727, 1953723506, 681825};
    	for(int i=0; i<3; i++)
    	{
    		checksumReversed[i] = _bruteforceChecksum(checksum[i]);
    		printf("Checksum: %d\n", checksumReversed[i]);
    	}
    
    	//Make password
    	char* password = (char*)&checksumReversed[0];
    	printf("Password: %s", password);
    }
    
    int main (int argc, char *argv[]) { 
    	//Get password :)
    	bruteForceAllChecksums();
    	printf("Original program runs now.\n");
    
    	//Run the original program (a bit reworked for readability)
    	const char cryptotext[] = "\xC8\x74\xD3\x36\x38\x10\xD0\x69\x78\x20\x3C\x0B\xC3\x74\xD7\x3E\x21\x04\xD0\x70\x62\x29\x38\x1E"; 
    	int checksum[] = {1969107214, 1336920198, 1615768230}; 
    	char password[12] = {0}; 
    
    	for(int i=0; i<11; i++)
    	{
    		password[i] = fgetc (stdin); 
    
    		if (password[i] == '\r')
    		{ 
    			i--; 
    		} 
    	}
    
    	int* password_int = (int*)password; 
    	int num_correct = 0; 
    
    	int key[3];
    	for(int i=0; i<3; i++)
    	{
    		int state = password_int[i]; 
    
    		int lo = state % 127773; 
    		int hi = state / 127773; 
    
    		int test = 16807 * lo - 2836 * hi; 
    
    		if (test > 0)
    			state = test; 
    		else
    			state = test + 2147483647; 
    
    		key[i] = state; 
    
    		lo = state % 127773; 
    		hi = state / 127773; 
    
    		test = 16807 * lo - 2836 * hi; 
    
    		if (test > 0)
    			state = test; 
    		else
    			state = test + 2147483647; 
    
    		if (state == checksum[i])
    		{ 
    			num_correct++; 
    		}
    	} 
    
    	if (num_correct != 3) { 
    		printf ("\nPasswort falsch!\n"); 
    		//Wait
    		fgetc (stdin); 
    		return EXIT_FAILURE; 
    	}
    
    	for(int i=0; i<sizeof(cryptotext) - 1; i++)
    	{
    		char c = ((char *)key)[i % 12] ^ cryptotext[i];
    		if (c == '\0') { 
    			break; 
    		} 
    
    		fputc (c, stdout); 
    	} 
    
    	fputc ('\n', stdout); 
    	//Wait
    	fgetc (stdin); 
    
    	return EXIT_SUCCESS; 
    }
    


  • Hi
    Vielen Dank!

    Eine Frage als Laie 🙂

    Wie bist Du auf die Lösung gekommen
    muß der Code "compiliert" werden?
    wenn ja wie?
    Danke.
    Gruß Jo



  • Ja, der Code muss mit einem C++ Compiler übersetzt werden. In meinem Fall war das Visual Studio.
    Und dann muss man natürlich noch das Passwort knacken. Das Programm hat einen Check ob das Passwort richtig ist, also muss man den Code analysieren und kann daraus das Passwort bekommen. 🙂



  • ..dankeschön.



  • DarkShadow44 schrieb:

    Ja, der Code muss mit einem C++ Compiler übersetzt werden. In meinem Fall war das Visual Studio.
    Und dann muss man natürlich noch das Passwort knacken. Das Programm hat einen Check ob das Passwort richtig ist, also muss man den Code analysieren und kann daraus das Passwort bekommen. 🙂

    Wie viele Jahre Erfahrung hast du mit C/C++? Ich bin Anfänger und mich interessiert es einfach nur so. 🙂



  • @CrispyTurtleAlligator
    Ein paar Jahre, wobei ich mich mit C++ deutlich weniger auskenne als mit C. Weiß gar nicht mehr wann ich mit C angefangen habe, ich schätze irgendwann zwischen 2008 und 2009.
    Und seit dem halt hobbymäßig am Programmieren. 😉
    Wobei ich mich mehr mit C# beschäftige, was aber für Konzepte wie das Verstehen von Code recht nebensächlich ist. 😃


Anmelden zum Antworten