Crackme, Anfängerthema

Hallo!
Ich habe hier mal ein schönes Crackme für Anfänger (Win32). Ich bin seit etwas mehr als einem Tag dabei und konnte es gut lösen. Darum wollte ich den Anderen dashier nicht vorenthalten.

Ziel ist es, einfach das Passwort herauszufinden, wobei egal ist, wie. Die Datei befindet sich im Anhang.

In der user32.dll einen Breakpoint auf MessageBoxExA setzen und den Stack im Auge behalten.

In "Maybe crackme#.0040102B" mal runterscollen und sich überlegen, was in den ganzen Wiederholungen das CMP macht. Auf Datentypen achten.

Hier mal meine Lösung. Hab alles schön kommentiert und wollte mal wissen, ob das Codeverständnis richtig ist:
(leider sind die Einrückungen weg, kann ich leider nix machen... :.( )
004010D5 |. 8BD0 MOV EDX,EAX
004010D7 |. 33C0 XOR EAX,EAX
004010D9 |. 33C9 XOR ECX,ECX
004010DB |. B9 00000000 MOV ECX,0 ; ECX ist wohl der char-array Index
004010E0 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Nullten Char in den Speicher schreiben
004010E3 |. 83F8 63 CMP EAX,63 ; Erstes Zeichen vergleichen
004010E6 |. 0F85 86000000 JNZ crackme#.00401172 ; Destruktor fals EAX != Wert
004010EC |. 33C0 XOR EAX,EAX ; Wenn EAX == Wert geht's hier weiter
004010EE |. 41 INC ECX ; ECX += 1
004010EF |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; "Ersten" char in den Speicher. (also zweites Zeichen)
004010F2 |. 83F8 72 CMP EAX,72 ; Zweites Zeichen vergleichen....
004010F5 |. 75 7B JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert
.........
0040114F |. 41 INC ECX ; Das Spiel geht immer so weiter
00401150 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Bis wir den letzten in den Speicher schreiben
00401153 |. 83F8 6B CMP EAX,6B ; und das Letzte Zeichen prüfen. :)
00401156 |. 75 1A JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert.
00401158 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL <- Rufft Fenster auf
0040115A |. 68 B9304000 PUSH crackme#.004030B9 ; |Title = " SUCCESS! !" <- ab hier ist's wohl klar ^^
0040115F |. 68 8C304000 PUSH crackme#.0040308C ; |Text = " good reverser!! but u are still a newbie..."
00401164 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401167 |. E8 3E000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA

Umrechnung für den CMP Befehl:
Hex=Dez=Char
63=99=c
72=114=r
61=97=a
63=99=c
6B=107=k
2D=45=-
62=98=b
72=114=r
65=101=e
61=97=a
6B=107=k

C++ Hilfsprogramm für die Umrechnung:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
for (int i=0;i<256;i++)
printf("%x = %c = %i\n",i,i,i);
system("PAUSE");
return EXIT_SUCCESS;
}

Das Passwort lautet:crack-break

MfG
Extinction
 
Ich mag es, wenn immer wieder was für Anfänger herausgebracht wird. Schließlich war jeder mal Anfänger.
Ich habe einfach das Programm durch RecStudio gejagt und da kam u.a. folgendes raus:
Code:
/*	Procedure: 0x004010C7 - 0x00401185
 *	Argument size: 4
 *	Local size: 0
 *	Save regs size: 0
 *	Called by:
 *		__entry_point__()
 */

L004010c7(A8)
struct HWND__ * A8;
{

    edi = M004030cc;
    edx = lstrlenA(M004030cc);
    ecx = 0;
    ecx = 0;
    if(( *M004030cc & 0xff) == 0x63) {
        ecx = 1;
        if(( *(1 + edi) & 0xff) == 0x72) {
            ecx = 2;
            if(( *(2 + edi) & 0xff) == 0x61) {
                ecx = 3;
                if(( *(3 + edi) & 0xff) == 0x63) {
                    ecx = 4;
                    if(( *(4 + edi) & 0xff) == 0x6b) {
                        ( *(5 + edi) & 0xff) :: 0x2d;
                        ecx = 6;
                        if(( *(6 + edi) & 0xff) == 0x62) {
                            ecx = 7;
                            if(( *(7 + edi) & 0xff) == 0x72) {
                                ecx = 8;
                                if(( *(8 + edi) & 0xff) == 0x65) {
                                    ecx = 9;
                                    if(( *(9 + edi) & 0xff) == 0x61 && ( *(0xa + edi) & 0xff) == 0x6b) {
                                        MessageBoxA(A8, " good reverser!! but u are still a newbie...", " SUCCESS! !", 0);
                                        return 0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    SendMessageA(A8, 0x10, 0, 0);
    return 0;
}
Ab da war der Rest einfach.
 
Ich bin selber noch ein Anfänger. Hier mein Lösungsweg

- In OllyDbg öffnen
- Strg+N um zu sehen welche Methoden benutzt werden ( GetDlgItemTextA war da dann ziemlich auffällig, mit dieser wird der eingegeben Text vom Eingabefeld zur Verarbeitung "abgeholt" )
- bisschen weiter mit f8 ( da wird dann mal überprüft ob ein Text eingegeben wurde über lstrlenA )
- noch bisschen weiter mit f8 da kommt dann eine Funktion die einen String als Parameter hat und wie ich mir die angesehen habe, war mir alles klar
- mittels ascii-tabelle dann die hex-werte in die Zeichen umgewandelt
 
Jep, ist es. Aber es hat mich nur 7 Tastenanschläge gekostet, die dezimale Variante auch noch auszugeben. Außerdem kann ich mir alles besser vorstellen, wenn's in guten alten dezimalzahlen geschrieben ist. :D
 
Hey, habt Ihr noch ein paar Lernbeispiele, wie "crackme#", würde gern mehr lernen und aktiv in das Thema mit einsteigen und mir aneignen!!!
Mfg
 
Zurück
Oben