CrackMe

g0d

Active Member
19 Aug 2017
32
113
#1
Hat neulich ein Mate erstellt. Hab selbst länger gebraucht als erwartet. Könnte für den einen oder anderen interessant sein.

Die einzige Regel besteht darin nicht zu Patchen. Versucht das Passwort mit sauberem Reverse Engineering zu extrahieren.

Wer in der Lage ist diese Aufgabe ohne Hilfe zu lösen, der kann sich selbst als "fortgeschritten" ( oder besser ) in x86 ASM einstufen.

Schwierigkeitsgrad: Medium

Ziel:
  • Richtiges Passwort eingeben
  • Diese MessageBox bekommen:


Sage es nochmal, Patching verboten :wink:

Links:
VT Scan: https://www.virustotal.com/#/file/9...d46440468b65d52186999fab96715727fe4/detection
Download: https://dropfile.to/6wp189F

Protip: Das Passwort ist nicht in der Binary hardcoded :wink:

Happy cracking.
 
Last edited:

.heaven

Hack User
25 Feb 2015
759
222
#5
könnte vielleciht jemand mal so ein timelapse zu dieser challenge machen? :grin:
für mich als coding nohand bestimmt interessant anzusehen :grin:
 

g0d

Active Member
19 Aug 2017
32
113
#6
https://i.imgur.com/GdLzB91.png
Code:
(uint8_t)((input[0] ^ 'R') | (input[2] ^ 'F')) == 0x10
Das Ganze auflösen nach dem ersten und dritten Character. Ergibt 3 Lösungen:
Code:
RxF
BxV
RxV
Das 'x' kann jeweils durch einen beliebigen Character ausgetauscht werden.
Nicht schlecht. Bist du durch den Stack-Setup auf den Aufruf der MessageBox aufmerksam geworden?
Ein alleinstehendes 'B' würde auch genügen :wink:

Für die anderen (401080):


Die "Protection" liegt in der Stack alignment.

Nice job.
 
C

calb

Guest
#9
Kurz vorweg : Habe es leider nicht geschafft.

Habe mir den Programmablauf angeschaut, interessant fand ich hierbei die Funktionen : sub_4010C0, sub_401040, sub_401080 .

Die Funktion sub_4010C0 setzt zunächst den Speicher an der Stelle im Speicher für Dst 0 mit 32 Byte ? Danach holt es sich die stdout und stdin array refernzen und schaut ob aus dem Stream gelesen werden konnte oder nicht. Wenn, dann wird der integer, welcher zu einem const char* umgecastet worden ist, Dst gexort. Das ganze für die Länge des Strings mit dem XorKey eines Byte Offsets an der Stelle des 3.Bits des Iterators "result". Als Rückgabewert liefert er den Iterator, ist aber irrelevant da der const char Pointer gexort worden ist.

Ab hier kam ich nicht weiter, da meine Assembly Skills noch zu schwach sind. Ich sehe er gibt die gexorte Variable - welche zu einem Byte2 - gecastet worden ist mit einem | ( oder ) als Parameter zur Funktion sub_401080.

Innerhalb des Assembly hier bin ich gescheitert. Ich sehe zwar dass ich zwei text offset's habe welche vermutlich zur MessageBox gehören wegen "Success!" und "Title" aber ich versteh nicht ganz was genau das Programm von mir will. ^^

Trotzdem vielen Dank für dieses Crackme, auch wenn ich gescheitert bin hab ich was gelernt. Heißt wohl demnächst Assembly vertiefen. ^^

In dem Sinne, ich wünsche allen einen schönen Abend !

Grüße, calb.
 

floezzzzzzzzzzzznnn

Real Advanced User
29 Nov 2014
130
275
#11
Nicht schlecht. Bist du durch den Stack-Setup auf den Aufruf der MessageBox aufmerksam geworden?
Ein alleinstehendes 'B' würde auch genügen :wink:

Für die anderen (401080):


Die "Protection" liegt in der Stack alignment.

Nice job.
ASLR aus + MessageBox wird immer gecalled => war klar, dass es sowas in der Art sein muss. Das Crackme hat mir gefallen, echt kreativ.

Dass 'B' auch eine Lösung ist habe ich leider im Eifer des Gefechts vergessen, ich habe mir meine mit folgendem Code gebruteforced:
Code:
for (int i = 0; i < 0x7F; i++)
{
   for (int j = 0; j < 0x7F; j++)
   {
       if (((i ^ 'R') | (j ^ 'F')) == 0x10)
           printf("%c %c\n", i, j);
   }
}
 
Likes: g0d

g0d

Active Member
19 Aug 2017
32
113
#12
ASLR aus + MessageBox wird immer gecalled => war klar, dass es sowas in der Art sein muss. Das Crackme hat mir gefallen, echt kreativ.

Dass 'B' auch eine Lösung ist habe ich leider im Eifer des Gefechts vergessen, ich habe mir meine mit folgendem Code gebruteforced:
Code:
for (int i = 0; i < 0x7F; i++)
{
   for (int j = 0; j < 0x7F; j++)
   {
       if (((i ^ 'R') | (j ^ 'F')) == 0x10)
           printf("%c %c\n", i, j);
   }
}
Es ist ja im Prinzip egal ob ASLR da mitmacht oder nicht. Einfachheitshalber wurden relocs/migration policies deaktiviert.
Aber nice job! Mache bald was neues.

LG