Dazu habe ich mal 'ne Frage: Hast du dir jemals dein Programm in einem Disassembler angeschaut? So ganz offensichtlich ist es da (zumindest für einen Anfänger in Reverse Engineering) nicht, was dein Programm macht.
Ich habe nicht das Gefühl, dass Du ein Anfänger bist. Doch selbst wenn ein Anfänger mein initiales Posting liest und sich die Strings im Bniärcode ansieht
--> Enter Password:
--> The secret number is %d
--> Sorry, no access
zAj/0heUHwT0.
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890./
sollte ihm der Hash auffallen. Wenn man sich dann noch die abhängigen shared libraries ansieht
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007faa67e67000)
und berücksichtigt, dass der Sourcecode in C unter 30 Zeilen beträgt (diese Info war von Anfang an gegeben), kommt man (hoffentlich) zwangsläufig zu der Schlussfolgerung, dass es sich um die *NIX crypt()-Funktion handelt, die ein eingegebenes Passwort auf o.g. Hash vergleicht. Den Salt sieht man bei crypt() den ersten beiden Stellen des Hashes an, wie Du weißt. Das vereinfachte Alphabet habe ich ebenfalls im Nachhinein vorgegeben und ein Debuggen ist nach wie vor der falsche Weg, der unnötig Zeit kostet und nicht zielführend ist, wie Du siehst.
Die Aussage, dass dieses Crackme durch ein primitives Bruteforce zu lösen ist, ist korrekt. Dies habe ich bewusst so gewählt, weil ich mir im Vorhinein dachte, dass viele erst mal nach Schema F den Debugger anwerfen um festzustellen, dass sie auf diesem Wege nicht weiter komme. Wie ihr sehen könnt, hat sich diese Annahme ebenfalls als richtig erwiesen. :wink:
Selbstverständlich gehe ich nicht davon aus, dass jeder einen 12-Core besitzt oder mehrere Rechner/Notebooks/Server hat, auf denen er parallelisieren kann. Zielgedanke meinerseits zur Lösung des Problems war jedoch, dass hier jemand ein auf mein Crackme zugeschnittenen Bruteforcer schreibt, dem man Passwortbereiche als Parameter geben kann. So hätten z.B. 5 Leute hier aus dem Forum den Bruteforcer downloaden können und das Crackme gemeinsam lösen können, jeder also einen Bestimmten Bereich aus dem Alphabet - Gruppenarbeit. Mal unabhängig davon, was hier die einzelnen Personen als crackme bezeichnen, Fakt ist, dass das Cracken einer Software durchaus nur durch primitives Bruteforcen (oder Rainbowtables) zu lösen sein kann und so einfach scheint's scheinbar also nicht zu sein.
Für mich war das Crackme gelöst, als du den Code veröffentlicht hast, der nichts anderes tut, als einen Hash zu vergleichen.
Wie in meiner initialen Aufgabenstellung präzise beschrieben, ist das Crackme genau dann gelöst, wenn mir jemand die
SecretNumber nennen kann. Zwischenzeitlich hat sich in dieser Aufgabenstellung nichts geändert, was dieses Crackme per formaler Definition nach wie vor als im Status ungelöst verweilen lässt.
Nun gut, dann will ich mal nicht so gemein sein. :wink: Von nun an wird die Problemlösung weder an mangelnden Ressourcen, noch an fehlender Gruppenarbeit scheitern, denn ich widme folgenden Lösungsteil:
Die
hinteren beiden Stellen des korrekten Passworts lauten: "
4U"
Zu knacken gilt es somit ein Passwort i.d. Form: "
******4U"
Nun möchte ich bitte keine Ausreden mehr der Form "dauert zu lange" oder "kein Bock auf Gruppenarbeit" oder "ist für mich bereits gelöst" oder "das ist doch kein richtiges Crackme" mehr lesen, denn es handelt sich fortan um das Knacken von 6 Stellen auf einem vorgegebenen, kleinen Alphabet, das auch auf einem std. Singlecore nur ein paar Sekunden beanspruchen sollte.
Ich erwarte die Lösung somit noch heute Abend. :wink: