Kleines Crackme [sehr einfach]

Hallo,
Hab auch mal probiert ein kleiner Crackme zu schreiben
Dürfte für euch recht einfach zu lösen sein.
Es ist Gelöst wenn ihr dir Ausgabe "crackme ist geschafft" erhaltet
patchen ist verboten!

gruß virus
 
Hi,

eigentlich ganz leicht :D
PW wird (und ist es auch) wohl nicht länger als 9 Zeichen sein ;)

MfG
fbisa
 
hatte ich gestern schon raus, nur wollte er das pw nie fressen... hatte nicht gesehen dass es keine Null sondern ein O war :/


olly disasm
Code:
Address   Hex dump          Command                                  Comments
00401430  |.  E8 ABBD0000   CALL 0040D1E0                            ; Allocates EAX bytes on stack
00401435  |.  E8 E6B90000   CALL 0040CE20                            ; [crackme.0040CE20
0040143A  |.  C74424 04 080 MOV DWORD PTR SS:[ESP+4],OFFSET crackme. ; ASCII "Hallo bitte gib das Passwort ein"
00401442  |.  C70424 E03344 MOV DWORD PTR SS:[ESP],OFFSET crackme.00
00401449  |.  E8 7AAD0300   CALL 0043C1C8                            ; [crackme.0043C1C8
0040144E  |.  C74424 04 98A MOV DWORD PTR SS:[ESP+4],crackme.0043AF9
00401456  |.  890424        MOV DWORD PTR SS:[ESP],EAX
00401459  |.  E8 C28C0200   CALL 0042A120
0040145E  |.  C74424 04 1C3 MOV DWORD PTR SS:[ESP+4],OFFSET crackme.
00401466  |.  C70424 E03344 MOV DWORD PTR SS:[ESP],OFFSET crackme.00
0040146D  |.  E8 56AD0300   CALL 0043C1C8                            ; [crackme.0043C1C8
00401472  |.  C74424 04 98A MOV DWORD PTR SS:[ESP+4],crackme.0043AF9
0040147A  |.  890424        MOV DWORD PTR SS:[ESP],EAX
0040147D  |.  E8 9E8C0200   CALL 0042A120
00401482  |>  C74424 08 0A0 /MOV DWORD PTR SS:[ESP+8],0A
0040148A  |.  8D45 E8       |LEA EAX,[LOCAL.7]
0040148D  |.  894424 04     |MOV DWORD PTR SS:[ESP+4],EAX
00401491  |.  C70424 803444 |MOV DWORD PTR SS:[ESP],OFFSET crackme.0
00401498  |.  E8 B3580200   |CALL 00426D50
0040149D  |.  8D45 E8       |LEA EAX,[LOCAL.7]
004014A0  |.  890424        |MOV DWORD PTR SS:[ESP],EAX
004014A3  |.  E8 E8FEFFFF   |CALL 00401390
004014A8  |.  A3 14304400   |MOV DWORD PTR DS:[443014],EAX
004014AD  |.  833D 14304400 |CMP DWORD PTR DS:[443014],1
004014B4  |.  75 16         |JNE SHORT 004014CC
004014B6  |.  C74424 04 290 |MOV DWORD PTR SS:[ESP+4],OFFSET crackme ; ASCII "crackme "
004014BE  |.  C70424 E03344 |MOV DWORD PTR SS:[ESP],OFFSET crackme.0
004014C5  |.  E8 FEAC0300   |CALL 0043C1C8                           ; [crackme.0043C1C8
004014CA  |.  EB 24         |JMP SHORT 004014F0
004014CC  |>  C74424 04 320 |MOV DWORD PTR SS:[ESP+4],OFFSET crackme ; ASCII "passwort falsch!"
004014D4  |.  C70424 E03344 |MOV DWORD PTR SS:[ESP],OFFSET crackme.0
004014DB  |.  E8 E8AC0300   |CALL 0043C1C8                           ; [crackme.0043C1C8
004014E0  |.  C74424 04 98A |MOV DWORD PTR SS:[ESP+4],crackme.0043AF
004014E8  |.  890424        |MOV DWORD PTR SS:[ESP],EAX
004014EB  |.  E8 308C0200   |CALL 0042A120
004014F0  |>  833D 10304400 |CMP DWORD PTR DS:[443010],1
004014F7  |.  74 02         |JE SHORT 004014FB
004014F9  |.^ EB 87         \JMP SHORT 00401482
004014FB  |>  833D 10304400 CMP DWORD PTR DS:[443010],1
00401502  |.  75 24         JNE SHORT 00401528
00401504  |.  C74424 04 430 MOV DWORD PTR SS:[ESP+4],OFFSET crackme. ; ASCII "ist geschaft!"
0040150C  |.  C70424 E03344 MOV DWORD PTR SS:[ESP],OFFSET crackme.00
00401513  |.  E8 B0AC0300   CALL 0043C1C8                            ; [crackme.0043C1C8
00401518  |.  C74424 04 98A MOV DWORD PTR SS:[ESP+4],crackme.0043AF9
00401520  |.  890424        MOV DWORD PTR SS:[ESP],EAX
00401523  |.  E8 F88B0200   CALL 0042A120
00401528  |>  C70424 510044 MOV DWORD PTR SS:[ESP],OFFSET crackme.00 ; ASCII "pause"
0040152F  |.  E8 9CF20000   CALL <JMP.&msvcrt.system>                ; Jump to msvcrt.system
00401534  |.  B8 00000000   MOV EAX,0
00401539  |.  C9            LEAVE
0040153A  \.  C3            RETN
 
Servus,
Hier ist noch der Quelltext für die die es intressiert
(Wundert Euch nicht über die Programmierweise ich hab gedacht wenn ich unsinnige Funktionen etc schreibe verwirrt das euch und ich kommt so schnell nicht ans passwort... War wohl ein Fehlschluss)

Code:
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int solved = 0;
int a = 0;
int r = 0;
char passwort[10];
int test(char eingabe[10]);
int test( char eingabe[10] ) {
    if (!( r == 1)) {
    strncpy(passwort, "gZf3O6", 6 );
    r = 1;
}
     for (int i=1; i<6 ;i++) {
         if (!(passwort[i] == eingabe[i])) {
         return 0;
         }
     }
     solved = 1;
     return 1; 
} 
       


int main(int argc, char *argv[])
{
    char pw[10];
    cout << "Hallo bitte gib das Passwort ein" << endl;
    cout << passwort << endl;
    do {
    cin.getline( pw, sizeof(pw));
    a = test( pw );
    if ( a == 1 ) {
         cout << "crackme ";
         }
    else {
         cout << "passwort falsch!" << endl;
         }
} while ( !(solved == 1) );
        if (solved == 1 ) {
                   cout << "ist geschaft!" << endl;
                   }
    system("pause");
    return EXIT_SUCCESS;
}

gruß Virus
 
Hallo Virus,

Das 08/15 Konstrukt

Code:
If (sUsereingabe == "1234-serial-1234"){
    cont << "crackme geschafft"
}else{
    cont << "serial falsch"
}
Ist sehr einfach nachzuvollziehen, auch in asm.(Dort gibts einen Compare und darauf folgend einen bedingten jump zu der Fehlermeldung. ) Man muss nun nur die Fehlermeldung suchen und den Jump zurück verfolgen und kommt an die Stelle wo die Serial mit der Eingabe verglichen wird, hier kann man sie aus dem Register abphishen.

Anstatt einen 1 zu 1 Vergleich zu machen, solltest du die Serial durch ein paar routinen Schicken die die Userserial auf ein paar Dinge testen - und so entscheiden ob die Serial gültig ist oder nicht.
 
yop, danke für die tipps,
ich dachte wenn ich dem string erst später seinen wert (per strncpy ) zuweise würde das etwas brignen... :D

gruß virus
 
pw

Hallöle!

Ich weiß, dass dieser Thread mittlerweile schon etwas veraltet ist, aber dennoch würde ich gern was loswerden:

Wie genau lest ihr denn das PW aus dem Register??
Oder noch besser: Wo genau??^^

Ich komme nicht mal bei der Analyse weiter...Wenn ich das Programm mit OllyDbg öffne, und Schritt für Schritt mit dem Pfeilbutton (oben) durchlaufen lasse, so stoppt er bei der Eingabe des Passwortes...aber was dann??
Dann kann ich mit meiner Analyse ja nur noch im Kopf weitermachen...aber wie kann ich dann irgendetwas aus nem Register auslesen, und wie genau mache ich das überhaupt??

Viele Grüße
Gapa
 
Zuerst setzt du einen Breakpoint auf die Stelle, an der die Eingebe eingelesen wird.
Nach dem Einlesen der Eingabe, wird eine Funktion aufgerufen, die das Passwort prüft:
00401482 |> C74424 08 0A00>/MOV DWORD PTR SS:[ESP+8],0A
0040148A |. 8D45 E8 |LEA EAX,DWORD PTR SS:[EBP-18]
0040148D |. 894424 04 |MOV DWORD PTR SS:[ESP+4],EAX
00401491 |. C70424 8034440>|MOV DWORD PTR SS:[ESP],crackme.00443480
00401498 |. E8 B3580200 |CALL crackme.00426D50 <---- pw einlesen
0040149D |. 8D45 E8 |LEA EAX,DWORD PTR SS:[EBP-18]
004014A0 |. 890424 |MOV DWORD PTR SS:[ESP],EAX
004014A3 |. E8 E8FEFFFF |CALL crackme.00401390 <---- pw überprüfen
004014A8 |. A3 14304400 |MOV DWORD PTR DS:[443014],EAX
004014AD |. 833D 14304400 >|CMP DWORD PTR DS:[443014],1
004014B4 |. 75 16 |JNZ SHORT crackme.004014CC
004014B6 |. C74424 04 2900>|MOV DWORD PTR SS:[ESP+4],crackme.004400>; ASCII "crackme "
004014BE |. C70424 E033440>|MOV DWORD PTR SS:[ESP],crackme.004433E0
004014C5 |. E8 FEAC0300 |CALL crackme.0043C1C8
004014CA |. EB 24 |JMP SHORT crackme.004014F0
004014CC |> C74424 04 3200>|MOV DWORD PTR SS:[ESP+4],crackme.004400>; ASCII "passwort falsch!"
004014D4 |. C70424 E033440>|MOV DWORD PTR SS:[ESP],crackme.004433E0
004014DB |. E8 E8AC0300 |CALL crackme.0043C1C8
004014E0 |. C74424 04 98AF>|MOV DWORD PTR SS:[ESP+4],crackme.0043AF>
004014E8 |. 890424 |MOV DWORD PTR SS:[ESP],EAX
004014EB |. E8 308C0200 |CALL crackme.0042A120
004014F0 |> 833D 10304400 >|CMP DWORD PTR DS:[443010],1
004014F7 |. 74 02 |JE SHORT crackme.004014FB
004014F9 |.^EB 87 \JMP SHORT crackme.00401482


00401390 /$ 55 PUSH EBP
00401391 |. 89E5 MOV EBP,ESP
00401393 |. 83EC 18 SUB ESP,18
00401396 |. 833D 18304400 >CMP DWORD PTR DS:[443018],1 ; |
0040139D |. 74 26 JE SHORT crackme.004013C5 ; |
0040139F |. C74424 08 0600>MOV DWORD PTR SS:[ESP+8],6 ; |
004013A7 |. C74424 04 0000>MOV DWORD PTR SS:[ESP+4],crackme.0044000>; |ASCII "gZf3O6"
004013AF |. C70424 1C30440>MOV DWORD PTR SS:[ESP],crackme.0044301C ; |
004013B6 |. E8 25F40000 CALL <JMP.&msvcrt.strncpy> ; \strncpy
004013BB |. C705 18304400 >MOV DWORD PTR DS:[443018],1
004013C5 |> C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
004013CC |> 837D FC 05 /CMP DWORD PTR SS:[EBP-4],5
004013D0 |. 7F 28 |JG SHORT crackme.004013FA
004013D2 |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4]
004013D5 |. 81C1 1C304400 |ADD ECX,crackme.0044301C
004013DB |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8]
004013DE |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
004013E1 |. 01C2 |ADD EDX,EAX
004013E3 |. 0FB601 |MOVZX EAX,BYTE PTR DS:[ECX]
004013E6 |. 3A02 |CMP AL,BYTE PTR DS:[EDX]
004013E8 |. 74 09 |JE SHORT crackme.004013F3
004013EA |. C745 F8 000000>|MOV DWORD PTR SS:[EBP-8],0
004013F1 |. EB 18 |JMP SHORT crackme.0040140B
004013F3 |> 8D45 FC |LEA EAX,DWORD PTR SS:[EBP-4]
004013F6 |. FF00 |INC DWORD PTR DS:[EAX]
004013F8 |.^EB D2 \JMP SHORT crackme.004013CC
004013FA |> C705 10304400 >MOV DWORD PTR DS:[443010],1
00401404 |. C745 F8 010000>MOV DWORD PTR SS:[EBP-8],1
0040140B |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040140E |. C9 LEAVE
0040140F \. C3 RETN

Hier kannst du das pw ganz leicht ablesen.
Solltest du nicht wissen, wie man Olly bedient -> google
Bevor du anfängst zu versuchen crackmes durch sinnloses rumklicken in Olly zu lösen, solltest du dir die Grundlagen von Assembler ansehen. Am besten schreibst du eigene Programme bspw. in C, und versuchst deren Ablauf in Olly nachzuvollziehen.

mfg, loose
 
olly

Hallo loose,

sehe ich das jetzt richtig, dass du einfach nur das PW aus der Kommentarliste abließt??
Ich dachte die ganze Zeit, man lese das PW irgendwie aus dem Register aus...?!
Und aus dieser Zeile werde ich nicht ganz schlau:
Code:
004013A7 |. C74424 04 0000>MOV DWORD PTR SS:[ESP+4],crackme.0044000>; |ASCII "gZf3O6"
Wird hier das PW ins Stackregister geschoben? Wenn ja, wie lese ich dieses dann da aus? Es kann doch nicht so einfach sein, dass man nur nach Textstrings suchen muss, und dann das PW aus der Kommentarliste auslesen kann..., oder?

Grüße
Gapa
 
Wird hier das PW ins Stackregister geschoben?
Genaugenommen wird die Adresse des PW auf den Stack (nicht ins Stackregister) geschrieben.
An der Adresse findest du dann das PW.

Wenn ja, wie lese ich dieses dann da aus?
Rechtsklick->Follow in Dump->Immidate Constant, Aber wie gesagt: Google, und die Dokumentation von Olly helfen weiter.

Es kann doch nicht so einfach sein, dass man nur nach Textstrings suchen muss, und dann das PW aus der Kommentarliste auslesen kann..., oder?
Bei simplen Crackmes wie diesem, ist das möglich, bei komplexeren natürlich nicht.
 
Hallo loose,

deine Lösung ist völlig akzeptabel, jedoch geht das noch einfacher, aber ist jedoch umständlicher. Ich schildere kurz in Stichpunkten wie ich vorgegangen bin:
  • Zuerst das CrackMe in Ollydbg geladen
  • Rechtsklick im Assemblercode, im Kontextmenü "Search for" wählen.
  • Nun "All referenced text strings" gewählt.
  • Und Voila - der erste String in der Liste ist das Passwort!
Dies ist, leider, nicht immer möglich. So einfach kann das auch sein. :)

the_uxreal
 
leutz... mein erstes crackme ohne hilfe :)
habs auch erst mit "Search for-> All referenced text strings" gemacht. Da stach mir eine Kombination sofort ins Auge... aufgeschrieben und dann normal erstmal bei den kommis geguckt... dort stand es auch und naja einfach ma probiert :D
-> RICHTIG :P
 
Auch wenn das Thema alt ist, möchte ich noch gern hinzufügen, das es eigentlich bei dem PW nur auf:

Zf3O6

ankommt.

Das PW kann

aZf3O6
bZf3O6
7Zf3O6
usw.

sein.

Das erste Zeichen wird nicht beachtet.
 
Zurück
Oben