CrackMes

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

Erstmal hallo, das ist mein erster Beitrag.
Ich habe aber schon lange mitgelesen...

Ich habe für euch einige CrackMes geschrieben - also Programme, an denen ihr versuchen
könnt, den "Kopierschutz" zu umgehen.
Also eigentlich ist es kein Kopierschutz, sondern wenn ihr ein Programm normal startet, dann
wird eine Zahl von 0 bis 1000000 zufällig ausgewählt, und daraus ein Hashwert berechnet.
Während es am Anfang wirklich nur eine Hashfunktion ist, bei der man nur das Salt aus der
Datei fischen muss, wird es in den höheren Levels komplizierter.
Eure Aufgabe ist es nun, den Hashwert zu berechnen, den das Programm ausgeben würde,
wenn die Zufallszahl 1000002 währe. Wenn ihr den habt, postet ihn hier und ich schaue, ob er stimmt.
Ich gebe euch auch immer die Lösung für die Zahl 1000001.

Zu Demonstration des Prinzips hier mal Level 0:

Code: Alles auswählen

import hashlib
import random

def check_env(): #Wird natuerlich komplizierter
    if random.randrange(1000000) > 1000000:
        raise ValueError("Das Manipulieren des Interpretes ist verboten!")
    if hashlib.md5("thisisnosalt"+"$"+"g").hexdigest()[:-8] != "839a2e3db552df314a5c563e":
        raise ValueError("Das Manipulieren des Interpretes ist verboten!")

check_env()
n = random.randrange(1000000)
v = hashlib.md5("thisissalt$"+str(n)).hexdigest()[:8]
print "theAngeles Python CrackMe - Level 0"
print "Zufallswert: %s"%n
print "Hash: %s"%v
Das Verändern der Module hashlib und random ist verboten. Ansonsten könnt ihr eigentlich machen,
was ihr wollt.
Bitte postet nicht den Weg zur Lösung, sondern nur die Lösung selbst. So kann sich der nächste dann an der
1000003 versuchen.

Die anderen Levels gibt es unter https://docs.google.com/open?id=0B6wm8U ... Y0YzJkOWEx
Viel Spaß und Erfolg!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

1000002 -> 14f66333

Irgendwie erschließt sich mir da der Sinn nicht, oder mache ich es falsch…

// Edit:
Level1:
1000002 -> 011a62de

Nett: "'/home/maximilian/Arbeitsfl\xc3\xa4che/CrackMes/Level1/script.py'" Was man da alles so finden kann …

//Edit:
Level2:
1000002 -> 3b4dd6c7
the more they change the more they stay the same
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dav1d hat geschrieben:1000002 -> 14f66333

Irgendwie erschließt sich mir da der Sinn nicht, oder mache ich es falsch…
Das geht mir genauso. Soll da etwas anderes herauskommen als

Code: Alles auswählen

hashlib.md5("thisissalt$"+str(1000002)).hexdigest()[:8]
?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@/me das is nur der Anfang, es wird "schwerer".
the more they change the more they stay the same
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Ich verstehe Level 1 nicht. Ist info.txt nicht falsch? Selbst bei verändertem random-Modul kommt da was anderes raus als vorgegeben …

Afaik:
Level 1:
1.000.003 → 543b3fce

Edit: Hast du eventuell Level 1 und Level 2 vertauscht?

Edit #2: Level 2:
1.000.003 → ad3f16a1
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

@nomnom: Ja hast recht, sorry.

@Dav1d: gut, alles richtig!
Aber so vieles hat keinen Sinn...

Okay, ist etwa bei allen noch der Quellcode dabei?
Oder gibt es einen Decompiler, der den Quelltext perfekt wiederherstellt?
Als ich die Rätsel für mich selbst gelöst hatte, schlug ich mit mit dis.dis
und anderen unschönen Methoden rum.

Aber Level 3 hat noch keiner, oder?
OK, das könnte man auch als mehrere Level auf einmal betrachten.

Vielleich mach ich auch noch Level mit pyInstaller oder so, dann sollte es schwerer werden
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

the!Angele hat geschrieben:Okay, ist etwa bei allen noch der Quellcode dabei?
Oder gibt es einen Decompiler, der den Quelltext perfekt wiederherstellt?
Als ich die Rätsel für mich selbst gelöst hatte, schlug ich mit mit dis.dis
und anderen unschönen Methoden rum.
Protip: Wer Rätsel erstellt, sollte idealerweise mehr Ahnung davon haben als die anvisierte Zielgruppe :twisted:
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

OK, normalerweise brauch man sowas ja auch nicht, oder?
Die meiste Python-Software ist doch eh OSS.
Zugegeben, eine Liste mit allen Konstanten in der Datei kann schon viel wert sein.
IMHO habe ich / hat mein Betriebssystem die ganzen Sourcen mit eingepackt (die Dateien mit der Tilde).
Ich habe mir wohl selbst ein Rätsel getellt :D
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

the!Angele hat geschrieben:IMHO habe ich / hat mein Betriebssystem die ganzen Sourcen mit eingepackt (die Dateien mit der Tilde).
Nein, der Sourcecode ist nicht dabei.

Waren meine Ergebnisse denn auch richtig? :P

Ich habe mich übrigens nicht mit `dis` oder einem Decompiler rumgeschlagen … Habe einen anderen Weg eingeschlagen. ;)
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

Ja die waren richtig!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Auf Level 3 habe ich keine Lust, das ist mir zu viel Arbeit, evt. wenn mir mal langweilig ist :).

Erst bei Level3 habe ich meinen/den Decompiler ausgepackt ;), http://nedbatchelder.com/blog/200804/th ... files.html hat mir geholfen. Std.-Lib patchen (wie nomnom?) wollte ich nicht, weil "the!Angele" ja auch meintest man dürfe das nicht.

Ach
Oder gibt es einen Decompiler, der den Quelltext perfekt wiederherstellt?
Ja den gibt es.

Interessant wäre es, ob es einen Python-Debugger gibt, der .pyc debuggen kann (gibts wahrscheinlich, ist mir nur nicht bekannt), normalerweise geht man ja an CrackMes mit gdb oder Olly ran.
the more they change the more they stay the same
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Dav1d hat geschrieben:Std.-Lib patchen (wie nomnom?) wollte ich nicht, weil "the!Angele" ja auch meintest man dürfe das nicht.
Ja, ich habe die Standardbibliothek „gepatchet“. Ich dachte mir, wenn man den Schutz umgehen soll (ValueError), dann umgeh’ ich ihn eben. ;) Und den Interpreter hab ich ja nicht verändert, wie es auch im Code von Level 0 steht …
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

@nomnom: Da hab ich mich halt doof ausgerückt...
Naja, so viel leichter hast du es dir damit auch nicht gemacht.
Hauptsächlich ging es mir darum, das keiner

Code: Alles auswählen

def randrange(start=0,end=0):
    return 1000002
schreibt 8)

Zu Level 3:
Es gibt einen einfacheren Weg!
Wenn man drauf gekommen ist, muss man nur eine Stufe entpacken!
Also überladet nicht eure Zeitvorgaben!
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

theAngeles Python CrackMe - Level 3
Zufallswert: 1000002
Starte berechnungen (kann kurz dauern)
Stufe 1
Stufe 2
Stufe 3
Stufe 4
Hash: 7a9da4e7
:) Und das ganze mit 10 Zeilen (Leerzeilen nicht inbegriffen) mit höchstens 31 Zeichen … Ich finde, die Lösung ist effizient genug.
Zuletzt geändert von nomnom am Samstag 25. Februar 2012, 15:54, insgesamt 1-mal geändert.
the!Angele
User
Beiträge: 6
Registriert: Mittwoch 22. Februar 2012, 19:19

Richtig!
Und nach dem posten des letzten Beitrags ist mir auch eingefallen,
wie man es löst ohne eine einzige Stufe zu entpacken.

Das nächste Level wird wahrscheinlich etwas ganz anderes....
Ich arbeite aber noch dran.
Antworten