[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,
    Ander

    edit: 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


Anmelden zum Antworten