Hacks & CrackmesTests, Fragen oder Hilfestellungen. Crackmes und Hackits werden hier diskutiert.
[Solved] Crackme 2
Diskussion: [Solved] Crackme 2 im Forum Hacks & Crackmes, in der Kategorie Software Home; Anzeige
Hallo Crackme-Fans,
mein 2. Crackme ist endlich (nach langem Debugging, es hat sich gelohnt ) fertig!
Es ist wieder ...
Anzeige Hallo Crackme-Fans,
mein 2. Crackme ist endlich (nach langem Debugging, es hat sich gelohnt ) fertig!
Es ist wieder eine Win32-Konsole mit VC++ und ASM programmiert, dh. wer kein Visual C++ 2010 und noch nicht die VCredist dafür hat, installiert das VCredist ersteinmal: Detail Seite Microsoft*Visual*C++*2010 Redistributable Package (x86)
Diesmal hab ich es nicht so leicht gemacht
Es gibt 2 Schwierigkeitsstufen und Aufgaben:
1. Passwort herausfinden
2. Patchen
Auf einer Skalar von 1 (einfach) - 5 (schwer) würde ich sagen das Aufgabe 1 2-3 ist und Aufgabe 2 3-4.
Tipps gibt's wenn es keienr schafft (irgendwer schafft das schon) und den Source gibt's, wenn beide Aufgaben gelöst sind!
Diesmal habe ich ein Extra eingebaut, was ihr euch ansehen könnt, wenn das Crackme gelöst ist (mit irgendeiner Technik).
Der ASM-Source des Extras ist mit dem FASM (Flat Assembler) Syntax geschrieben und zwischen den ;###...# kann man es ändern, damit man ganz einfach mit Assembler direkt auf den Speichern zugreifen kann und außerhalb der ###s wird es auf den Bildschirm projeziert. Natürlich hab ich ein sehr schönes Beispiel eingebaut, lasst euch überraschen!
Wenn ihr es gelöst habt, wäre es nett wenn ihr mir mitteilt wie schwer es für euch war, wie ihr es fandet und wie ihr es gelöst habt
Ansonsten wünsch ich euch viel Spaß!
Mfg TheShadowAE
PS:
Die Exe ist mit UPX gepackt!
EDIT:
Ich hab die DEP-Exception beseitigt!
Neuer Download.
Geändert von TheShadowAE (26.07.11 um 20:46 Uhr)
Grund: Solved
Hallo an alle nochmal,
ich melde mich um zu melden, dass die DEP-Exception jetzt beseitigt ist, wenn das Crackme gelöst ist, sage ich auch mehr zum Programm und ihr kriegt den Source.
Ich hoffe ihr interessiert euch jetzt wieder mehr an meinem Crackme und habt Spaß am Lösen.
Hab es bis jetzt nur mal kurz in Olly reingeschmissen konnte es aber bis jetzt nicht lösen. Ich konnte nichtmals die Stelle finden, wo das eingegebene Passwort überhaupt mal benutzt wird . Ist es denn eigentlich richtig, dass standardmäßig das Programm einfach zu geht bei falscher Eingabe? Ich hab mal ein bisschen an der Stelle rumgespielt wo geschrieben wird (sinngemäß) "Richtig" und "Falsches Passwort. Versuch es nocheinmal" und zweiters tauchte nur nach ein paar Veränderungen in den Jumps auf aber nicht standardmäßig...sieht für mich daher erstmal komisch aus.
Aber ab diesem Wochenende hab ich Zeit ohne Ende, da werde ich mich mal genauer mit beschäftigen (auch nochmal mit dem von mucki)
Hab es bis jetzt nur mal kurz in Olly reingeschmissen konnte es aber bis jetzt nicht lösen. Ich konnte nichtmals die Stelle finden, wo das eingegebene Passwort überhaupt mal benutzt wird .
Hint
dafür gibt es solche netten Features wie Hardware oder Memory Breakpoints (on access) - sobald auf einen bestimmten Bereich zugegriffen wird, stoppt Olly ;). Diese Breakpoints können auch im "Dump" oder "Stack" Fenster über Rechtsklickmenü gesetzt werden.
Zitat:
Ist es denn eigentlich richtig, dass standardmäßig das Programm einfach zu geht bei falscher Eingabe?
Jep.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
dafür gibt es solche netten Features wie Hardware oder Memory Breakpoints (on access) - sobald auf einen bestimmten Bereich zugegriffen wird, stoppt Olly ;). Diese Breakpoints können auch im "Dump" oder "Stack" Fenster über Rechtsklickmenü gesetzt werden.
Text
Ja richtig, allerdings habe ich den Wert nur (jetzt aus der Erinnerung :D) im MSVCRT Modul und aufm Stack gefunden. Im Stack ist es nur beim überschreiben angesprungen und im Bereich des anderen Moduls gar nicht. Vielleicht wollte Olly auch einfach nicht. Aber wie gesagt werde mich damit ab dem Wochenende näher mit beschäftigen und wenn was bei rumkommt mich melden.
Ja richtig, allerdings habe ich den Wert nur (jetzt aus der Erinnerung :D) im MSVCRT Modul und aufm Stack gefunden.
Jein
Es sollte sehr hilfreich sein, erstmal die Stelle zu suchen, an der das Passwort eingelesen wird. Direkt danach kann man mittels der Breakpoints "verfolgen", was damit so getrieben wird ;)
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
Bei mir wird bei falscher Eingabe aber nichts ausgegeben, deswegen hab ich mich gewundert wozu der "Falsch, versuch's nochmal!" String vorhanden ist ,den ich wie gesagt gefunden hatte...bzw. ich habe beide Strings gefunden auch die Jumps die drüber springen, aber ich musste erst einen Jump ändern damit er überhaupt das "Falsch" ausgibt, ansonsten schließt er einfach. Kannst du das nochmal überprüfen? Bei mir schließt das Fenster einfach. Sowohl im Debugger als auch wenn ich es einfach so starte.
Wenn bei dir kein "Druecke eine Taste zum Beenden" kommt, hast du vielleicht noch die alte Version? Ich weiß nicht ob ich noch was verändert habe, aber bei mir kommt der String.
Für den Fix müssen wir die "Verschlüsselung" zurück rechnen. Also XOR 55 mit einem ROL 2. Die gefixten Stellen
müssen dann nur noch bei dem Ladevorgang angepasst werden. Das sind folgende Stellen:
__________________________________________________ ___________
Das hier
00402FA8 C74424 4C 57AD84>MOV DWORD PTR SS:[ESP+4C],8084AD57
00402FB0 C74424 50 28FF97>MOV DWORD PTR SS:[ESP+50],DE97FF28
Wird zu:
00402FA8 C74424 4C 57AD84>MOV DWORD PTR SS:[ESP+4C],1784AD57
00402FB0 C74424 50 28FF97>MOV DWORD PTR SS:[ESP+50],DE97FF17
__________________________________________________ ____________
Das hier
00402FE0 C74424 68 AD8080>MOV DWORD PTR SS:[ESP+68],448080AD
Wird zu:
00402FE0 C74424 68 AD8080>MOV DWORD PTR SS:[ESP+68],171780AD
__________________________________________________ ____________
Das hier
00403089 C78424 AC000000 >MOV DWORD PTR SS:[ESP+AC],59FA0584
Wird zu:
00403089 C78424 AC000000 >MOV DWORD PTR SS:[ESP+AC],59FA05FA
__________________________________________________ ____________
Das hier
004030E1 C78424 CC000000 >MOV DWORD PTR SS:[ESP+CC],5A518451
Wird zu:
004030E1 C78424 CC000000 >MOV DWORD PTR SS:[ESP+CC],5A51FA51
__________________________________________________ ____________
Das hier
004030F7 C78424 D4000000 >MOV DWORD PTR SS:[ESP+D4],69555551
00403102 C78424 D8000000 >MOV DWORD PTR SS:[ESP+D8],AD5796EB
Hast du das Passwort denn herausgefunden? Die von dir genannten Stellen hatte ich ja auch gefunden nur nicht gepatched/abgespeichert.
@TheShadowAE
Ich habs hier erst heute runtergeladen. Vielleicht hast du ausversehen die alte Version nochmal hochgeladen? Funktioniert es denn so, wenn du es hier runterlädst und startest? Bei mir geht das Fenster wie gesagt einfach bei einer Eingabe zu. Es kommt nichts mit "Falsch" oder "Drücke was zum Beenden" usw.
Ich habs hier erst heute runtergeladen. Vielleicht hast du ausversehen die alte Version nochmal hochgeladen? Funktioniert es denn so, wenn du es hier runterlädst und startest? Bei mir geht das Fenster wie gesagt einfach bei einer Eingabe zu. Es kommt nichts mit "Falsch" oder "Drücke was zum Beenden" usw.
Ich habe es ausprobiert, bei mir funktioniert es.
Der Sourcecode ist im Anhang, aber vorhher habe ich noch etwas dazu zu sagen:
Beschreibung
Ich habe eine Assembelrcode assembliert und wie herausgefunden mit xor und bitrotation einfach verändert. Den Assembler-Code hab ich in einen mit new (Heap) alloziierten Speicher geschrieben und mit CallWindowProc ausgeführt, deswegen gab es die DEP-Exception. Der Fix bestand aus SetProcessDEPPolicy, weil man mit VirtualAlloc alloziierten Speicher nicht mit CallWindowProc auslesen und ausführen lassen kann. (Hat vielleicht jemand eine Lösung, wie ich den Code im VirtualAlloc(Ex)-Speicher ausführen kann?)
Das Passwort ist nochmal mit xor und bitrotation einfach verschlüsselt. Es wird einzeln mit stosb in den vorgesehenen Buffer übertragen.
Dann werden an 4 Stellen hintereinander die verschlüsselten Strings verglichen, wenn eine Überprüfung Erfolg hatte, wurde eax eins hochgezählt. Eine Überprüfung fand mit SSE statt.
Wenn dann zu Falsch oder Riichtig gesprungen wurde, wurden noch mehrere Sachen überprüft, die Patch-Schutz geben sollten:
-(2 mal vorher wurden übrigens Jumps überprüft)
-ecx und eax mussten 1 sein (eax, weil ich shift right 2 gemacht hab)
-der Erste Buchstabe musste richtig sein
am Ende wurde der String dann in den Buffer übertragen, der vom C++-Code übergeben wurde.
Ich hab übrigens möglichst auf Jump-Vergleiche verzichtet und zum Beispiel eax mit shr eax,2 auf 1 gebracht und eine Adresse mit eax multipliziert!
Ich hatte 2 Anti-Debugging Methoden:
IsDebuggerPresent und die RDTSC-Methode.
Dann hab ich noch Fragen an die Solver:
-Wie schwer was es für euch?
-Wie fandet ihr dieses Crackme?
-Wie habt ihr es gelöst?
-Wie fandet ihr das Extra? (ich hoffe ihr habt euch das angeguckt )