First CrackMe by MrSpider

Servus!

Möchte euch hiermit mein erstes CrackMe präsentieren. Sollte theorethisch relativ einfach sein...

- Kein Patchen
- Gesucht ist das richtige Passwort.

Feedback erwünscht ;-)
EDIT: Fehler behoben, Programm funktioniert jetzt ordnungsgemäß
Ist vllt doch schwieriger als ich anfangs angenommen hatte.

HINT:
Passt auf Schleifen auf!
 
Zuletzt bearbeitet:
Hat 20 Sekunden gedauert :p
pw: 13610
 
Zuletzt bearbeitet von einem Moderator:
Komisch, das ist eigentl gar nicht die Lösung ... (Funktioniert bei mir auch nicht)
Da ist wohl was schiefegelaufen beim erneuten Hochladen

So jetzt ist die aktuelle Version oben -_-
 
Jetzt bist du ein witzbold.
MOV EAX,DWORD PTR DS:[EBX]
ist eax = 3258 und das wird IMMER ausgeführt, egal was man eingibt.
das heisst es wird an 0x004013C7 IMMER gesprungen und somit
natürlich auch nie an der Addresse (was nötig wäre)i:
004013EC. Desweiteren wird die erste Zahl bzw der erste Buchstabe von den eingegeben password garnicht gecheckt.
DH:
Erste Zahl bzw Buchstabe egal.
So weiter....
PW muss sein XBCDEF (erste wird wie gesagt nicht gescheckt ),
damit hier --->
004013A4 |. /7F 1A JG SHORT CrackMe1.004013C0

nicht gesprungen wird und somit nicht 3258 in EAX gepackt wird.
Jedoch ist es egal ob dort gesprungen wird oder in den anderen möglichen jump (in der PW check function) 3258 wird immer in EAX gesetzt.
Weil beide jumps zu der
MOV EAX,DWORD PTR DS:[EBX]
Zeile springen und wie bereits gesagt, ändert sich ebx nicht.
Wers nicht glaubt kann es testen.
Code:
004013C2   |.  3D 5A320000                  CMP EAX,325A
004013C7   |.  7C 1E                        JL SHORT CrackMe1.004013E7
004013C9   |.  C703 BEBA0000                MOV DWORD PTR DS:[EBX],0BABE
004013CF   |>  8D9D E4FDFFFF                LEA EBX,[LOCAL.135]
004013D5   |.  891C24                       MOV DWORD PTR SS:[ESP],EBX
004013D8   |.  E8 83000000                  CALL CrackMe1.00401460
004013DD   |.  8D65 F4                      LEA ESP,[LOCAL.3]
004013E0   |.  31C0                         XOR EAX,EAX
004013E2   |.  5B                           POP EBX                                           ;  CrackMe1.00403016
004013E3   |.  5E                           POP ESI                                           ;  CrackMe1.00403016
004013E4   |.  5F                           POP EDI                                           ;  CrackMe1.00403016
004013E5   |.  5D                           POP EBP                                           ;  CrackMe1.00403016
004013E6   |.  C3                           RETN
004013E7   |>  3D BEBA0000                  CMP EAX,0BABE                                     ; |
004013EC   |.^ 74 E1                        JE SHORT CrackMe1.004013CF                        ; |

ps:
auch wenn das pw pBCDEF ist, damit am anfang gesprungen wird ändert sich EBX nicht
(da der erste Buchstabe doch verglichen wird und zwar mit p, aber egal wie mans dreht und wendet, es wird in eax immer 2258 sein).
Soviel zu deinem neuen hochgeladen crackme nachdem ich dein vorheriges nach 20 sekunden geknackt hab :>

004013EC an der Zeile müsste übrigens gesprungen werden
damit "das kannst du besser" nicht ausgegeben wird, aber ich hab ja erklärt,
das es unmöglich ist das dort gesprungen wird weil dort halt vergleichen wird
ob eax 0xBABE ist.


Insgesamt wird verglichen ob der erste Buchstabe "p" ist, der zweite "B" der dritte "C" der vierte
"D" und der letzte "E"
 
Zuletzt bearbeitet:
Passwort ist (bis auf ersten Buchstaben) richtig. Es gibt noch einen zusätzl. Schutz, ganz am Anfang (welcher eigentl. auch gepatcht werde kann). Dieser Schutz verändert den Wert, welcher letzenendes überprüft wird und dadurch den GoodBoy ausgibt.

Das Pw wär eigentlich ABCDEF, wobei noch ei weiterer Schutz eingebaut ist, und zwar dass mind. ein Kommandozeilenparameter angegeben ist.

Quellcode:
Code:
/*
 * main.c
 *
 *  Created on: 16.11.2009
 *      Author: MrSpider
 */

#include <stdio.h>
#include <string.h>

void badBoy(int*);

int main(int argc, char **argv) {

    char buf[255];
    char msg[255];
    int *point;
    char *buf2 = (buf);
    int x = 0x55;
    int bckup = 0;
    int *pb = &bckup;

    if (argc <= 1) {
        int x = 0x3254;
        point = &x;
        int *p = point;
        --(*p);
        strcpy(msg, "Etwas fehlt noch...");
    } else {
        int x = 0x3254;
        point = &x;
    }

    goto NEXT;
    EXIT:
    return 0;
    NEXT:

    printf("Enter password: ");
    fflush(stdout);
    scanf("%s", buf2);

    if (strcmp(buf, "pw?!") == 0) {
        (*point)--;
        strcpy(buf, "Owned");
    }

    *pb = *point;

    int i = 0;
    for (i = 0; i < 6; ++i) {
        if(*(buf+i) == ('A' + i)){
            (*point)++;
        }
    }

    if(*point >= (0x320F ^ x)){
        *point = 0xBABE;
    }

    if(*point == (0xA88A ^ 0x1234)){
        void (*p2) (int*) = &(badBoy);
        p2 += (*point) ^ 0xBABE;
        (p2)(pb);
        goto EXIT;
    }
    printf("Das kannst du besser *g*\n");

    return 0;
}

void badBoy(int *val){
    if(*val == 0x3253 || *val == 0x3252){
        printf("Aber fast. Fast geschafft!");
        return;
    }
    printf("Thinks that's right");
}
 
Zuletzt bearbeitet von einem Moderator:
Also, wie im vorherigen Post gesagt, ist der zusätzliche Schutz, dass mind. ein Kommandozeilenparameter angegeben wird (zB: crackme.exe -param). Der Check auf "pw?!" ist ein FakeCheck, welche durch die Compileroptimierung noch weiter verschleichert, sodass es gleicht als ob auf BCDEF verglichen wird. Sieh dir den Quellcode in meinem vorherigen Post an, dann sollte es eigentlich klar sein. --> Its not a Bug, it's a feature.

Code:
00401310  |.  837D 08 01    CMP DWORD PTR SS:[EBP+8],1 <-- Vergleich ob mind. ein Kommandozeilenparameter
00401314  |.  8985 E4FDFFFF MOV DWORD PTR SS:[EBP-21C],EAX
0040131A  |.  0F8E E4000000 JLE CrackMe1.00401404 <-- Wenn nicht springe nach unten und führe anderen Code aus
00401320  |.  BB 54320000   MOV EBX,3254 --X
00401325  |.  899D DCFDFFFF MOV DWORD PTR SS:[EBP-224],EBX --X
0040132B  |.  8D9D DCFDFFFF LEA EBX,DWORD PTR SS:[EBP-224] --X
00401331  |> /C70424 003040>MOV DWORD PTR  SS:[ESP],CrackMe1.00403000 ; |||ASCII "Enter password: " <-- Hierhin wird dann zurückgesprungen

--X: Code wird nicht ausgeführt, bei weniger als 1 Kommandozeilenparameter. Wenn mal also den Jump noped und als PW ABCDEF benutzt, läuft alles super.
 
Zuletzt bearbeitet:
Naja stimmt das es so klappt, die Sache ist jedoch die,
der Anwender einer Software muss wissen wie diese
normalerweise funktioniert. DH wäre dein Programm
richtige Software, würde es auch bei normalen
ausführen kein Password akzeptieren.
 
Zurück
Oben