Seite 1 von 1

Erstes Skript: Brute Force für MD5-Hashes

Verfasst: Donnerstag 19. April 2007, 15:59
von DB_420
Hallo,

ich bin jetzt schon länger programmierend tätig, erst in QBasic, dann VB.NET, anschließend C#; nun möchte ich mir Python zu Gemüte führen, es sieht ja sehr praktisch aus.

Hier mein erstes Skript: Es ist ein Brute-Force-Script für MD5-Hashes:

Code: Alles auswählen

import hashlib
import string
import time

def checkHash(targetHash,baseString,testRounds):
    changedBaseString = baseString
    for a in string.printable:
        changedBaseString = baseString
        changedBaseString += a
        temphash = hashlib.md5(changedBaseString).hexdigest()
        print "Teste:", changedBaseString,"/",temphash
        if temphash == targetHash:
            return changedBaseString
        else:
            if testRounds > 1:
                temp=checkHash(targetHash,changedBaseString,testRounds-1)
                if temp is not None:
                   return temp
                   
hash1 = raw_input("Bitte einen hexadezimalen MD5-Hash eingeben: ")
rounds = int(raw_input("Bitte geben sie die zu probierenden Stellenanzahl ein: "))
start = time.time()
temp = checkHash(hash1,"",rounds)
if temp is not None:
    print "Ihr Passwort ist: ", temp
else:
    print "Es wurde keine Uebereinstimmung gefunden - probieren sie es eventuell mit mehr Stellen!"
print "Rechenzeit: ", time.time()-start, "sec"

Gruß
Daniel

Verfasst: Donnerstag 19. April 2007, 19:04
von schlangenbeschwörer
Hi!
Ich kenn hashlib jetzt nicht, desswegen kann ich da nicht viel zu sagen, aber in Zeile 17 und 26, das ´temp!=None´ ist etwas komisch. Ich würde in jedem Fall etwas zurückgeben(wird doch nicht, oder?) und dann ´if temp´ schreiben.
Außerdem kannst du dir beim nächsten Mal das Getippe für das ´alphabet´ sparen: Das Modul ´strin´ hat das nämlich in Konstanten schon gespeichert. Hier wär das, wenn ich das richtig sehe, ´ascii_lowercase´, ´ascii_uppercase´, ´digits´ und die Sonderzeichen, die du dann selbst dazuschreiben musst, das es nicht alle Zeichen aus ´punktuation´ sind.
Da du den zweiten raw_input nicht weiter testest, sondern direkt an ´int´ übergibst, könntest du direkt ´input´nehmen.
Schließlich könntest du auch den Teil von Zeile 6-18 in eine Schleife in der Funktion packen, anstatt diese rekursiv auszuführen.

Gruß, jj

(Ich hoffe, das ist nicht alles Quatsch)

Verfasst: Donnerstag 19. April 2007, 20:04
von Leonidas
schlangenbeschwörer hat geschrieben:Da du den zweiten raw_input nicht weiter testest, sondern direkt an ´int´ übergibst, könntest du direkt ´input´nehmen.
Danger! ``input`` funktioniert wie ``exec raw_input`` und nicht wie ``int(raw_input)``.

Achja. Hallo Daniel, willkommen im Forum.

Verfasst: Freitag 20. April 2007, 13:48
von schlangenbeschwörer
Leonidas hat geschrieben: Danger! ``input`` funktioniert wie ``exec raw_input`` und nicht wie ``int(raw_input)``.
Ja, stimmt.
Aber ist das nicht, solange der User es auf seinem eigenen Rechner laufen lässt, nicht egal? Wer einen anderen Befehl eingibt, der Schaden anrichten könnte, was das dann wohl, und wer sich die eigene Festplatte zerschießen will, sollte nicht daran gehindert werden. :wink:

Verfasst: Freitag 20. April 2007, 13:56
von Rebecca
Aber wenn irgendwo steht "Gib eine Zahl ein", so erwarte ich, dass eine Fehlermeldung kommt, wenn ich "rm *" eingebe, und nicht, dass stillschweigend der Befehl ausgefuehrt wird, und ich mich hinterher wundere, was denn loss ist.

Wenn da jetzt stehen wuerde: "Welcher Befehl soll ausgefuehrt werden?", ist das natuerlich was anderes.

Verfasst: Freitag 20. April 2007, 14:21
von schlangenbeschwörer
Na gut...ihr hab ja Recht. War auch nicht so ganz erns gemeint, wobei es wohl recht unwahrscheinlich ist, dass man ausversehen einen solchen Befehl eingibt...

Verfasst: Freitag 20. April 2007, 14:54
von BlackJack
Ist mir noch nicht oft passiert, aber ich habe auch schonmal nachdem ich am Rechner unterbrochen wurde (Telefonanruf, Katze macht blödsinn, …) in ein falsches Fenster getippt. Einmal sogar mit etwas unangenehmeren Folgen weil das Heimatverzeichnis in dem ich Änderungen vorgenommen hatte, nicht das auf dem Rechner war, wo ich eigentlich etwas machen wollte, sondern lokal. Da war ich glücklich über ein vorhandenes Backup. :-)

Verfasst: Freitag 20. April 2007, 15:44
von Leonidas
BlackJack hat geschrieben:Ist mir noch nicht oft passiert, aber ich habe auch schonmal nachdem ich am Rechner unterbrochen wurde (Telefonanruf, Katze macht blödsinn, …) in ein falsches Fenster getippt.
Right, manchmal sieht man nicht auf den ersten Blick, ob ein Fenster lokal ist oder nicht. Aber wenigstens versuche ich nicht irgendwelche Sachen während des telefonierens am Computer zu machen (vor allem nicht tippen, klicken geht noch), weil dabei dann meist Blödsinn rauskommt.

Verfasst: Freitag 20. April 2007, 19:54
von EyDu
Leonidas hat geschrieben:Right, manchmal sieht man nicht auf den ersten Blick, ob ein Fenster lokal ist oder nicht.
Ja ja, erst gestern habe ich meinem Chef das Kennwort einer Remote-Desktopverbindung zugeschickt... :D

Verfasst: Samstag 21. April 2007, 02:14
von Y0Gi
Tipp: Auch Strings sind Sequenzen, daher kann man durch 'abc' ebenso iterieren wie durch ['a', 'b', 'c']. Zudem gibt es im Modul `string` einige Konstanten, die man verwenden kann.

Weiterhin wäre noch eine Prise PEP 8 sehr hilfreich (konkret: Leerzeichen nach Kommas sowie vor und nach binären Operatoren wie = oder +=)und auch die Namen der Parameter der Funktion lassen zu wünschen übrig ;)

Ob ein Objekt None ist, prüft man besser und schneller(?) mit dem Identitätsoperator 'is' anstelle von '!=' oder '=='.

Verfasst: Dienstag 24. April 2007, 18:34
von DB_420
Hallo,

vielen Dank für eure Tipps und die Aufnahme ins Forum :D

Ich habe eure Vorschläge mal eingearbeitet, das Resultat sieht man im ersten Beitrag.

Gruß
Daniel

Verfasst: Dienstag 24. April 2007, 21:44
von birkenfeld
Rebecca hat geschrieben:Aber wenn irgendwo steht "Gib eine Zahl ein", so erwarte ich, dass eine Fehlermeldung kommt, wenn ich "rm *" eingebe, und nicht, dass stillschweigend der Befehl ausgefuehrt wird, und ich mich hinterher wundere, was denn loss ist.

Wenn da jetzt stehen wuerde: "Welcher Befehl soll ausgefuehrt werden?", ist das natuerlich was anderes.
Naja, um "rm /" mit input() auszuführen, muss man schon etwas kreativer sein... ;)

Verfasst: Dienstag 24. April 2007, 22:05
von BlackJack
Der Aufwand hält sich in Grenzen. :-)

Code: Alles auswählen

In [2]: input()
__import__('os').system('echo hallo')
hallo
Out[2]: 0

Verfasst: Dienstag 24. April 2007, 23:57
von birkenfeld
Das meinte ich ja... `__import__` ist nicht gerade eines der bekanntesten Builtins.