Mein erstes tolles crackme ;)

Hallo,

habe dieses Board erst kürzlich entdeckt und bin prompt auf diesen Thread gestoßen. Er hat mich sehr neugierig gestimmt und sogleich machte ich mich an die Arbeit ein kleines crackme zu entwerfen. Den Schwierigkeitsgrad kann ich leider nicht einschätzen, da ich bis jetzt noch keine Erfahrungen diesbezüglich gesammelt habe und ein absolutes "Greenhorn" in diesem Bereich bin. Ich hoffe es ist trotzdem nicht zu einfach :). Wer das Passwort gefunden hat, bitte mit Spoiler posten. Über Verbesserungsvorschläge wäre ich natürlich dankbar! Viel Spaß!


MFG enorm
 
Sollte für Anfänger gut geeignet sein - und nur mit einem Hexeditor kommt man hier nicht weiter ;)
muss man schon selber im Debugger ablesen ;)
 
Ich sehe gerade ein "Solved-Häckchen" - aber keine Lösungen ;) ?

Nur weil ich manchmal nicht wiederstehen kann und kurz reinschaue/meinen Senf dazugebe, muss es nicht gleich als gelöst gelten ;)
 
Es war wirklich nicht so ganz einfach (wobei ich auch noch Anfänger bin)
ywmqsakciimi]
 
Hut ab! Ich muss aber gestehen, dass ich mich hierbei zu sehr auf die Generierung des zu vergleichenden Keys versteift habe, womit der Vergleichspunkt (das magische "if" :)) relativ leicht aufzuspüren und nachzuvollziehen ist. Etwas schwerer gestalltet sich die Sache, wenn auch die Usereingaben manipuliert und durch diverse Funktionen verändert werden. Denke, dass ich einige dieser Schwächen mit meiner 2ten Version ausmerzen konnte.
 
Lösungsweg

Hallo alle zusammen!

@Eydeet:
Darf ich nach dem Lösungsansatz bzw. nach dem kompletten Lösungsweg fragen? Ich bin auch noch neu hier und suche nach Lösungsansätzen, von denen ich etwas lernen kann...
Ich wäre dir dafür sehr dankbar :)

Viele Grüße
Gapa
 
Ich habe erst mal nach der Stelle gesucht, an der der Key eingelesen wurde, indem ich in Olly immer wieder [Strg]+[F8] gedrückt habe, und an der Stelle an der er mit der Ausführung angehalten hat einen Breakpoint gesetzt habe. Dann habe ich das Programm zurückgesetzt, bin mit F9 zum Breakpoint "gesprungen", habe diesen entfernt und bin mit F7 in den Call gegangen usw.

Dann habe ich irgendwann rechts am Rand gesehen, wie der String "pw: " auf den Stack gepusht wurde (= Ausgabe) und habe dann weiter unten den String "done!" gesehen (=Erfolgsmeldung).
Diese Meldung ist von einem Conditional Jump umschlossen, der über die Erfolgsmeldung springt, wenn AL=0 ist. Mir war also klar, dass im Call darüber entschieden wird, ob AL=0 ist, also ob die Serial richtig ist. Ich habe mir also diese Funktion angeguckt:
Code:
00401326    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]             ; eax = *key
00401329    8D56 01         LEA EDX,DWORD PTR DS:[ESI+1]
0040132C    8D4E 02         LEA ECX,DWORD PTR DS:[ESI+2]
0040132F    0FBE0407        MOVSX EAX,BYTE PTR DS:[EDI+EAX]          ; eax = key[i]
00401333    47              INC EDI                                  ; ++i
00401334    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX            ; save char
00401337    89D0            MOV EAX,EDX                              ; irgendeine komplizierte Berechnung
00401339    0FAFC2          IMUL EAX,EDX
0040133C    0FAFC2          IMUL EAX,EDX
0040133F    89CA            MOV EDX,ECX
00401341    0FAFD1          IMUL EDX,ECX
00401344    6BC0 03         IMUL EAX,EAX,3
00401347    6BD2 05         IMUL EDX,EDX,5
0040134A    01D0            ADD EAX,EDX
0040134C    6BD1 0B         IMUL EDX,ECX,0B
0040134F    29D0            SUB EAX,EDX
00401351    83C0 1F         ADD EAX,1F
00401354    99              CDQ
00401355    31D0            XOR EAX,EDX
00401357    29D0            SUB EAX,EDX
00401359    D3E0            SHL EAX,CL
0040135B    BA 1A000000     MOV EDX,1A
00401360    89D1            MOV ECX,EDX
00401362    99              CDQ
00401363    F7F9            IDIV ECX
00401365    83C2 61         ADD EDX,61
00401368    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
0040136B    3955 EC         CMP DWORD PTR SS:[EBP-14],EDX            ; prüfe Char mit entschlüsseltem Buchstaben (hier kann man den richtigen Buchstaben in EDX auslesen)
0040136E    A3 10504400     MOV DWORD PTR DS:[445010],EAX
00401373    75 10           JNZ SHORT crackme_.00401385              ; wenn keine Übereinstimmung: setze AL=0 und brich ab
Wenn du in C programmieren kannst, solltest du kein Problem haben, meine Kommentare zu verstehen. ;)

Wenn jemand von den erfahreneren Reversern hier nen Tipp für mich hat, wie man das Crackme schneller/einfacher hätte lösen können, immer her damit! :)
 
Asm

Hallo nochmal!

Erst mal vielen Dank für die Erläuterung!

Ich sehe hier sehr deutlich, dass ich ohne Ahnung von Assembly keine Chance habe, mit dem Cracken weiterzukommen, richtig?

Ich habe da mal noch ein paar Grundfragen:

1. Ist der erste Schritt, wenn man nur ein .exe Programm als Ausgangspunkt hat, OllyDbg zu benutzen und das Programm (mit Assemblerkenntnissen) zu durchforschen? Oder gibts da noch andere Möglichkeiten?

2. Bedeutet "patchen" ein Programm mit OllyDbg analysieren?

3. Wenn ich in OllyDbg das Crackme öffne, und [Strg] + F8 drücke, dann beginnt OllyDbg mit einer Endlosschleife, die immer zwischen ein paar Zeilen hin-und-herspringt, aber was genau soll ich da nun herausbekommen?

Ich hoffe, ihr könnt mir da etwas weiterhelfen! Ich werde mich in der Zeit mal an Assembly ranmachen :D

Viele Grüße
Gapa

Ach: PS:
Gibts irgendwo ne deutsche Anleitung oder ein Tut für OllyDbg (wenn nicht ist auch egal, dann dauerts eben länger^^)?
 
1. Nein. Erstmal beobachtet man das Programm allgemein. Welche Eingabemöglichkeiten hat man, welche Fehlermeldungen gibt es? Was passiert, wenn man große Eingaben tätigt. Mit FileMon und Regmon schaut man auch erstmal, ob es beim Programmstart und bei Serialeingabe ungewöhnliche Zugriffe auf die Registry gibt. Also allgemeine Informationen sammeln.
2.Patchen heißt: Ändern. Also einen Daten/Codebreich des Programms in etwas anderes umschreiben.
 
Asm

Hm, ok vielen Dank!

Und wie siehts mit den andren Fragen aus? Wo lerne ich am besten etwas über JMP bzw. Calls und was ich daraus schließen kann? Und wo lerne ich OllyDbg richtig zu bedienen (Was sind BreakPoints, wofür brauche ich sie...)

Viele Grüße
Gapa
 
... und ganz allgemein erstmal Assembler lernen...
denn Assembler schreiben ist schon eine Kunst, Assembler lesen ist noch wesentlich schwieriger, vorallem, wenn man keine Kommentare mehr im Code hat ;)
 
Zurück
Oben