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.