Speicherzugriffsfehler bei Brute-Force-Programm



  • Hallo Leute,
    ich hab da folgendes Problem:

    Ich habe, wie oben schon genannt, ein Brute-Force-Programm, das versucht,
    ein im Programm festgelegtes Passwort zu erraten.
    Oft klappt das auch recht effektiv.
    Doch manchmal erhalte ich beim selben Passwort eine Speicherzugriffsverletzung.
    Da ich am Programm nichts verändere, gehe ich davon aus, dass es am Betriebssystem (Ubuntu) liegt, oder liegt der Fehler doch im Code?

    Ich weiß, der folgende Code ist nicht optimal, ich hab gerade erst begonnen:

    const string alph = "abcdefghijklmopqrstuvwxyz";
    
    string check_if_z (string str) {
    	for (int i=1; i< str.length(); i++)
    	{
    		if (str[i] == 'z')
    		{
    			str[i-1] = alph[alph.find(str[i-1])+1];	
    			str[i] = 'a';
    		}
    	}
    	return str;
    }
    
    string increase_last(string str) {
    
    	str[str.length()-1] = alph[alph.find(str[str.length()-1])+1];
    	return str;
    }
    
    int main () {
    	string passwort = "test";
    	string text = "aaaa";
    
    		while(text != "zzzz") {
    
    			if (text == passwort) {
    				cout << "Passwort erraten!" << endl;
    				cout << "Passwort war: " << passwort << endl;
    				cout << "Interne Variable ist: " << text << endl;
    				exit(0);
    			}	
    			text = check_if_z(text);
    			text = increase_last(text);
    		}
    
    	return 0;
    }
    

    MfG Chris_


  • Mod

    Chris_ schrieb:

    Da ich am Programm nichts verändere, gehe ich davon aus, dass es am Betriebssystem (Ubuntu) liegt, oder liegt der Fehler doch im Code?

    Hah, das ist ja mal eine lustige Schuldzuweisung. Natürlich liegt das an deinem Code. Glaubst du wirklich, dass ein Betriebssystem das millionenfach benutzt wird solche Fehler haben könnte?

    Schmeiß mal den Debugger an und sag wo der Fehler auftritt, dann findet man auch ganz schnell die Ursache. Die Symptome die du beschreibst sind ganz typisch für ein Programm welches über die Grenzen von Containern hinaus zugreift.



  • Tut mir leid, da hab ich mich falsch ausgedrückt!
    Natürlich hat Ubuntu keinen solchen Fehler 😃 .

    Ich meinte damit eigentlich die Schwankungen der Größe des Arbeitsspeichers,
    den das BS bzw. andere Programme besetzen.

    Die Sache mit dem Debugger hab ich natürlich schon probiert,
    doch wenn ich das Programm mit gdb laufen lasse, erhalte ich den Fehler nicht mehr; alles macht, was es soll.



  • Da dein Programm nicht wirklich viel Speicher auf dem Heap allokiert, bezweifel ich, dass es an irgendwelchen Arbeitsspeichergeschichten liegt. Wenn das new, was der String intern macht, scheitern würde, bekämst du ja eh ne Exception an den Kopf geworfen.

    Hab das mal bei mir laufen lassen (auch Ubuntu ;)), und mir mal die Passwortversuche ausgeben lassen.
    Auszug:

    abax
    abay
    abaz
    abbb
    abbc
    abbd
    

    Ich vermute mal, dass du nicht beabsichtigst, dass z.B. "abba" nie erraten werden würde. 😉
    Also schau dir nochmal an, was da genau passiert. Vermutlich findest du dann auch den Grund für das Gescheppere.



  • Dobi schrieb:

    Ich vermute mal, dass du nicht beabsichtigst, dass z.B. "abba" nie erraten werden würde. 😉

    Vielen Dank für den Hinweis, das war natürlich nicht beabsichtigt 😃 .
    Ich habe diesen Fehler nun ausgebessert, indem ich in der Main prüfe, ob text == check_if_z(text).
    Obwohl ich nicht ganz verstehe, was das am ursprünglichen Code ändert,
    da ich den selben Speicher ja immer noch beschreibe, ist der Fehler (bis jetzt) nicht mehr aufgetreten.

    Vielen Dank
    Chris_



  • das "find" kannst du dir auch sparen.
    Jedes Zeichen hat ja eine Nummer ( ASCII ) und diese brauchst du einfach nur um eins erhöhen, eben solange bis du bei 'z' bist. Dann sparst du dir das string::find und das alph-Array



  • Chris_ schrieb:

    string increase_last(string str) {
    
    	str[str.length()-1] = alph[alph.find(str[str.length()-1])+1];
    	return str;
    }
    

    Folgende Fehlermöglichkeiten:

    1. Letzter buchstabe in str ist nicht im Alphabet enthalten -> alph.find gibt npos zurück. alph[npos+1] ist nicht was du willst...
    2. Letzter Buchstabe ist z -> alph.find gibt 25 zurück. Du greifst damit auf alph[26] zu und langst hinter das Ende von alph.

Anmelden zum Antworten