papaschlumpf7777: Passwort-Knacker verursacht `Out uf memorie & `Stack overflow

Vor kurzem bin ich auf eine Website gestoßen, wo `Hackits zu lösen sind.
Das sind legale Aufgaben die Spaß machen und einen Lern-Effekt haben.
Bei Erfolg darf man sich dann ins Gästebuch eintragen.
Bis Level 12 hatte ich keine größeren Probleme.
Nachdem ich Level 13 entschlüsselt hatte und mir den Quelltext ansah, stellte ich fest, daß diese JavaScript-Aufgabe nur mit einem Passwort-Knack-Programm zu lösen ist. Die Gleichung läßt sich nicht umdrehen um die Unbekannte(Passwort) zu errechnen.

Erstens kenn ich mich mit offiziellen Passwort-Knack-Programmen nicht aus und zweitens möchte ich ja programmieren lernen. So ging ich dran mir ein eigenes Programm in JavaScript zu schreiben...

Die ersten Versuche waren mit verschachtelten Schleifen zwar klein, aber auch unübersichtlich.
Das Problem ist, daß keins funzte.
Stack overflow... und Out of memorie... wurden meine nicht gewollten und ständig präsenten Fehlermeldungen.

Da es sich bei dem gesuchten Passwort um ein Passwort mit 8 Stellen und vermutlich nur kleinen Buchstaben handelt, habe ich Mitlerweile auf die Eingabe der Stellen verzichtet und für jede Stelle eine eigene Variable und eine eigene Funktion erstellt, da ich dachte somit den Fehlermeldungen zu entweichen und dem eigentlichen Ziel etwas näher zu kommen ...

Hier der Quelltext, den ich leicht Verständlich und mit Kommentaren versehen habe:

<html>
<head>
 <title>Passwort-Knacker</title>
</head>

<body onLoad="auf_Null_setzen()">

<script type="text/javascript">
<!-- Globale Variabeln ***Arrays werden hierbei nicht benötigt*** //-->

var Stellen        = 8;           // Anzahl der Stellen des Passwortes ***wird hierfür nicht benötigt***
var Bereich_Anfang = 97;          // Beginnt mit dem kleinen a
var Bereich_Ende   = 122;         // Endet   mit dem kleinen z
var pass           = new Array(); // hier hatte ich die globalen Variabeln,
var pass_Zahl      = new Array(); // für die benötigten Arrays,
var pass_Array     = new Array(); // deklariert.
var wo_steht_was   = new Array(); // in diesem Programm werden sie z.Z. nicht benötigt...

function auf_Null_setzen()
{
 for (i=0; i<= (Stellen-1);++i)
 {
  Position_00  = Bereich_Anfang;
  Position_01  = Bereich_Anfang;
  Position_02  = Bereich_Anfang;
  Position_03  = Bereich_Anfang;
  Position_04  = Bereich_Anfang;
  Position_05  = Bereich_Anfang;
  Position_06  = Bereich_Anfang;
  Position_07  = Bereich_Anfang;
  pass_Position_00 = String.fromCharCode(Position_00);
  pass_Position_01 = String.fromCharCode(Position_01);
  pass_Position_02 = String.fromCharCode(Position_02);
  pass_Position_03 = String.fromCharCode(Position_03);
  pass_Position_04 = String.fromCharCode(Position_04);
  pass_Position_05 = String.fromCharCode(Position_05);
  pass_Position_06 = String.fromCharCode(Position_06);
  pass_Position_07 = String.fromCharCode(Position_07);
 }
 Stelle_00();
}

function Stelle_00()        // Erhöhung der ersten Stelle des Passwortes
{
 for (i_Stelle_00=Bereich_Anfang; i_Stelle_00<= Bereich_Ende;++i_Stelle_00)
 {
  Position_00      = i_Stelle_00;
  pass_Position_00 = String.fromCharCode(Position_00);
  pass             = pass_Position_00 + pass_Position_01 + pass_Position_02 + pass_Position_03 + pass_Position_04 + pass_Position_05 + pass_Position_06 + pass_Position_07;

document.write(pass+"_"); // Dient nur zur Überprüfung während der Programierung.
                            // An dieser Stelle steht normal die Übergabe zu der
                            // Passwort-Abfrage-Funktion die ich zur besseren Übersicht entnommen habe.
 }
  document.write("<br>");   // Dient nur zur überschaulichen Überprüfung während der Programierung.
  Stelle_01();
}

function Stelle_01()        // Erhöhung der zweiten Stelle des Passwortes
{
 if (Position_01 <= Bereich_Ende -1)
 {
  ++Position_01;
  pass_Position_01 = String.fromCharCode(Position_01);
  Stelle_00();
 }
  document.write("<br>");   // Dient nur zur überschaulichen Überprüfung während der Programierung.
  Position_01  = Bereich_Anfang - 1;
  Stelle_02();
}

function Stelle_02()        // Erhöhung der dritten Stelle des Passwortes
{
 if (Position_02 <= Bereich_Ende -1)
 {
  ++Position_02;
  pass_Position_02 = String.fromCharCode(Position_02);
  Stelle_00();
 }
  document.write("<br>");   // Dient nur zur überschaulichen Überprüfung während der Programierung.
                            // Wenngleich das Programm nicht soweit kommt
  // An dieser Stelle soll zu der nächsten Funktion verwiesen werden ...
  // Leider bleibt das Programm schon hier, bei dem kleinen i,
  // wegen "Out of memory .." stehen.
  // Ähnliche Versuche erzeugten an gleicher Stelle (+-)
  // den Fehler: "Stack overflow ..."
  //
  // Gibt es Möglichkeiten den Speicher, an einer beliebigen Stelle,
  // zurück zu setzen oder genügend Speicher zu deklarieren???
  //
  // Gibt es in JavaScript überhaupt eine Möglichkeit ein Passwort-Knack-Programm zu schreiben ???
  // Die erforderliche Variable für die Überprüfungs-Funktion muß immer gleich bleiben.   // In diesem Fall heist sie pass.
}

</script>

</body>
</html>

Ein Dankeschön schon im Vorfeld für Eure Hilfe!

  1. Tja Papa Schlumpf, so wird das nichts fürchte ich...

    Mal eine kleine Überschlagsrechnung
    Für ein Passwort mit max. 8 Stellen gibt es selbst bei der alleinigen Verwendung von Kleinbuchstaben ca. 208827064576 Möglichkeiten (26^8)
    Eine solche Anzahl Passwörter sind allein schon Pi*Daumen knapp 1,5 Terabyte im Speicher. Falls du also vorhast alle im Array pass zu speichern würd ich vorher noch schnell in den Computerladen an der Ecke gehn und ein paar Riegel RAM kaufen.
    Gleiches gilt natürlich auch wenn du sie alle nur auf dem Bildschirm ausgibst.

    Aber auch wenn du sie nicht speicherst und nur der Reihe nach ausprobiertst bräuchstest du selbst wenn du 10.000 Passwörter pro Sekunde durchprobieren kannst ca. 8 Monate dafür.

    Bleibt nur die Verwendung sogenanner "Wortlisten". Kann man sich ganz leicht hergoogeln.
    Wahrscheinlich kannst du sogar die Sprache eingrenzen die das Passwort haben müsste (wohl deutsch oder englisch) und eine passende Liste runterladen. Dazu gibts auch genug Programme die das durchprobieren für dich übernehmen und erheblich effizienter sind als eine JavaScript-Funktion.
    Falls das PW allerdings wirklich rein zufällig gewählt ist hast du mit der Methode auch Pech.

    Ich vermute allerdings das die Aufgabe eine Hintertür hat, sonst wär sie bei einem bis zu 8-stelligen Passwort ja eigentlich nicht lösbar (außer man hat nen Cray im Keller stehn).

    Max

    1. 1. Danke für Dein Bemühen. Das ist heutzutage nicht Selbstverständlich, daß sich jemamd um andere Probleme kümmert als die Eigenen.
      2. Das Array "pass" reicht als normale Variable(Sorry, durch die vielen Versuche ist es gekommen, daß ich pass mal als Array deklariert habe, um zu testen ob dadurch mehr Speicher freigegeben wird)
      3. Das mit den knapp 1,5 Terabyte(8Monate...) wage ich zu bezweifeln(vieleicht hab ich ja auch nur einen kleineren Daumen als Du)

      Nun mal Spaß beiseite. Ich bin davon ausgegangen, daß wenn ich eine Variable(oder auch Array) neu definiere, sie in alter Form nicht mehr zwischengespeichert wird.
      Das heist, wenn z.B. die Variable pass vor der neuen Definition den Inhalt "aaaaaaaa" hat und durch "baaaaaaa" neu definiert wird, war ich bis vor kurzem dem Glauben, daß die "Speicher-Schublade" nicht überfüllt, sondern erst geleert und danach mit der neu definierten Variable abgespeichert wird. Leider scheint dem nicht so zu sein...

      Was den Bildschirmausdruck angeht, so dient er z.Z. nur zur Überprüfung was das Programm macht. Bei dem jetzigen Stand darf ich hoffen, daß selbst die vierte Stelle noch auf den Monitor passt ohne ein paar Riegel Ram nachzurüsten.

      Was Dein Tip, mit "Wortlisten" und Programme die nicht in JavaScript programiert sind, angeht, bin ich Dir Dankbar. Aber auch ich habe schon daran gedacht und lehne diese Methode ab, da ich programmieren lernen möchte. Nun scheine ich mit diesem Problem wiedermal an meine bescheidenen Grenzen gekommen zu sein.
      Aus diesem Grund habe ich mich hier ans Forum gewandt und hoffe, daß es Möglichkeiten gibt, den Speicher für die schon abgehandelte Variablen, wieder frei zu geben.

        1. Das mit den knapp 1,5 Terabyte(8Monate...) wage ich zu bezweifeln

        Rechne mal nach (über nen großen Daumen): (26^8 * 8 Byte) / (1024^4)

        Was Dein Tip, mit "Wortlisten" und Programme die nicht in JavaScript programiert sind, angeht, bin ich Dir Dankbar. Aber auch ich habe schon daran gedacht und lehne diese Methode ab, da ich programmieren lernen möchte.

        Das schließt sich doch nicht aus! Aber ohne Listen wirst du imho nicht weit kommen (allerdings kenn ich die Aufgabe natürlich nicht genau ... ). Du musst ja trotzdem programmieren - mit JavaScript ist es halt schwierig irgendwelche externen Dateien auszulesen...
        Aber wenn man programmieren lernen will sollte man sich vielleicht nicht auf JavaScript konzentrieren. Versuchs mal mit Java oder C - ist alles nicht so schwer wies scheint.

        Meines Wissens dürfte JavaScript übrigens durchaus nicht den Speicher vollstopfen wenn man einer Variable einen neuen Wert zuweist. Dein "Speicherleck" muss also wo anders liegen.
        Freigegeben wird der Speicher meines Wissens auch wieder automatisch wenn die Variable nicht mehr gebraucht wird. Explizit freigeben würd ich mit
        variable = null;
        Aber wie gesagt, dein speicher geht irgendwoanders flöten.

        1. Danke für den Tip "Variable = null;" !
          Das werd ich gleich Morgen ausgiebig testen und googeln.
          Du wirst lachen, aber sowas ähnliches hatte ich auf gut Glück mal versucht. Leider funzte das nicht. Aber Stück für Stück komme ich der Sache näher(zumindest lern ich dazu).

          Was Dein Tip mit Programiersprachen angeht, so kann Dir sagen, daß ich seit ein paar Monaten c++ lerne und mitlerweile auch eine gute Website für die Windows API gefunden hab, die mir sehr weitergeholfen hat.
          Das mit den Hackits/JavaScript war zufällig und hat mich inzwischen gefesselt. Zumindest so lange, bis ich auch das letzte Level geknackt hab.

          C++ ist eine mächtige Sprache und sehr umfangreich. Darum wird auch in Zukunft mein Augenmerk immer mehr auf c++ gerichtet sein.

          Was die Speicherzuordnung angeht, bin ich noch ganz grün hinter den Ohren, doch solange man sich mit der Problematik nicht auseinandersetzt, ist eine Lösung meist meilenweit entfernt.
          Darum werd ich versuchen mein kleines "Passwort-Knack-Programm" zum laufen zu bringen!!!

    2. Eine Hintertür hat die Aufgabe meines Wissens nicht.

      Ich hab Dir hier mal die vereinfachte Version, ohne den unnötigen Schnickschnack der unrelevant für die Lösung ist, kopiert.

      Vieleicht habe ich ja doch was übersehen oder falsch interpretiert.

      <script language='JavaScript1.2'>;
      i=1;

      function verifyID()
      {
       var unknown = 'ÎÑÉÙÊÓâàÙÑ?ÛÍâèæÒ';
       var decode  = new Array();
       var pwdec   = new Array();
       var eurl    = new Array();
       var verify  = new Array();
       if (i != 6)
       {
        for (k=0; k<= unknown.length-1;++k)
        {
         decode[k] = unknown.charCodeAt(k);
        }

      for (j=0; j<= unknown.length-1;++k)
        {
         for (k=0; k<= pass.length-1;++k)
         {
          pwdec[j] = String.fromCharCode(decode[j]-pass.charCodeAt(k));

      if (j == unknown.length-1)k = pass.length-1;++j
         }
        }

      for (k=0; k<= unknown.length-1;++k)
        {
         eurl[k]   = pwdec[k];++k;
         verify[k] = pwdec[k]
        }
        resurl = eurl.join("");
        resver = verify.join("");

      if (pass == resver)
        {
         document.write("Richtiges Passwort:_"+pass+"_");
        }
        else
        {
         return
        }
       }
      }

      </script>

    3. Sorry, das Hackit ist mathematisch Lösbar.

      Nach wiederholtem Überprüfen, stellte ich fest, daß ein Gedankengang nicht zu Ende gedacht war.
      Stunden später und nach etliche Qualmwolken aus meinem Kopf hab ich die eigentliche Aufgabe, auf mehreren Blätter Papier und einigen document.writes mehr, gelöst.

      Um nicht allen den Spaß zu verderben, werd ich das Lösungswort(8 kleine Buchstaben, zusammengereiht zu einem Wort(was heist, daß eine Wortliste möglich ist)) hier nicht posten.

      Dies alles heisst aber noch lange nicht, daß ich nicht weiterhin versuchen werde ein Passwort-Knack-Programm in JavaScript zu schreiben.

      Wenn ihr also ein Buch oder eine Website kennt, die das Thema der Speicherreservierung behandelt, würde ich mich freuen.