[geloest] string eingabe durch ein minimum begrenzt?
-
Hallo,
ich habe fuer einen Freund der gerade Assembler lernt und versucht .exen zu cracken dieses kleine Programm geschrieben. Das Lernziel habe ich zwar hier erreicht, aber fuer mich voellig unverstaendlich: die Eingabe in Zeile 16 hat eine Untergrenze, die der Laenge des strings "real" entspricht.
Mit Untergrenze meine ich, dass das Programm abstuerzt. Ich benutze Dev-C++ und den dazugehoerigen Compiler.#include <string> #include <iostream> using namespace std; int main() { string real = "6hu"; //5gt int laenge = real.length(); string eingabe; string stemp; string temp; cout << "PW eingeben: "; cin >> temp; for(int n = 0; n < laenge; n++) { char ctemp = temp.at(n); ctemp++; stemp = ctemp; eingabe.append(stemp); } if(eingabe==real) { cout << "\nErfolg!"; } else { cout << "\nGescheitert!"; return 1; } return 0; }Mir wurde gesagt, dass der fehler in der for-Schleife liegt. Allerdings wuesste ich nicht, wieso die das beeinflussen sollte... Ich bin Programmieranfänger.
Ausserdem passend zur Thematik vielleicht einen Stups in die richtige Richtung, damit ich die eingabe==passwort Abfrage "verstecken" kann?
Danke schonmal,
Anderedit: zig Fehler
-
Probier mal:
for (int n = 0; n < temp.length(); n++)Ansonsten werden nur so viele Zeichen angefügt, wie real lang ist.
Ich habe keine Ahnung von Programmen cracken, aber mir ist spontan folgendes eingefallen:
#include <iostream> #include <string> void MixStr(std::string& str); int main() { std::string Password = "a474ed3b"; std::string Eingabe; std::cin >> Eingabe; if (Eingabe.length() != Password.length()) { return 0; } MixStr(Password); for (unsigned int i = 0; i < Password.length(); ++i) { if (Eingabe[i] != Password[i]) { return 0; } } std::cout << ":-)" << std::endl; } void MixStr(std::string& str) { for (unsigned int i = 0; i < str.length() - 1; ++i) { if (str[i] % 2 == 0) { std::swap(str[i], str[i + 1]); } } }Das Passwort lautet: a74ed3b4
-
Hallo,
Dein Quelltext geht davon aus, daß die Länge von temp mindestens der von real entspricht. Wenn jedoch weniger Text eingegeben wurde, wird hier eine Exception geworfen:
char ctemp = temp.at(n);Die Abbruchbedingung Deiner Schleife muß also angepasst werden:
for(int n = 0; n < laenge && n<temp.length(); n++)mfg Martin
-
Danke!
Musste ja so eine einfache Loesung sein^^Die MixStr Funktion muss ich mir noch angucken, aber sieht schonmal vielversprechend aus.
-
Dein Algorithmus scheint mir nicht wirklich schwer zu knacken zu sein, da wäre schon etwas mehr Mathematik nötig. Was Schönes zum Knappern wäre z.B., den SHA-Hash deines Passwortes zu speichern und die Eingabe auf Hashübereinstimmung zu prüfen. Dann bleibt für den Cracker nur noch, im Programm die Sprungbefehle zu ändern.
BTW: Dev-C++ ist veraltet und sollte nicht mehr verwendet werden.
-
Was empfiehlst du denn als kostenlose Alternative fuer Windows?
Hashübereinstimmung war bereits fuer spaetere Versionen geplant
-
ander schrieb:
Was empfiehlst du denn als kostenlose Alternative fuer Windows?
Hashübereinstimmung war bereits fuer spaetere Versionen geplant
Visual C++ 2010 Express oder Code::Blocks