Erste CrackMes

Hi @ All,

ein Freund von mir ist Interessierter in Programmierung,
da habe ich ihm mal gebeten ein paar CrackMes zu basteln.
Er hat darauf auch ein paar gemacht mit unterschiedlichen Compilern, diese will ich euch natürlich nicht vor enthalten, natürlich sind sie sehr einfach, da ersten seine ersten sind, aber dennoch bitte:

PS:
Wäre nett wenn mir jemand sagen könnte wie man den ersten CrackMe patched, da der wichtige jump ausserhalb ist...
 
Ich beantworte nur mal deine Frage, da ich denke, dass du den Rest alleine schaffst.

PS:
Wäre nett wenn mir jemand sagen könnte wie man den ersten CrackMe patched, da der wichtige jump ausserhalb ist...

Die Instruktionen der Hauptschleife des Programms sind zwar zum Zeitpunkt des Ausführens außerhalb. Aber die können ja nicht einfach "aus dem nichts" kommen.
Tatsächlich befindet sich der Code (und auch Konstanten übrigens) zuvor in der ".data" Section der Executable und wird von da erst herauskopiert in neu reserviertem Speicher.
Dort können wir natürlich erst hinterher patchen. Also zum Zeitpunkt des Ausführens.
Aber in der ".data" Section können wir schon vorher patchen.

Den Jump hast du sicher schon gefunden. In der ".data" Section findet man den dann auch:

Code:
10128190   21C0                        AND EAX,EAX
10128192   0F84 FCFFFFFF               JE 10128194

Vorsicht. Noch ist der Jump ungültig. (Die Instruktion jumpt "in sich selbst hinein")
Das Sprungziel wird erst hinterher korrigiert. Also nachdem der unkorrigierte Code von ".data" zu dem reservierten Speicherbereich kopiert wird.

Zum patchen gibt es nun zwei Möglichkeiten. Die eine ist einfach und langweilig. Dort patcht man einfach die Instruktionen vor dem Sprung so, dass immer das Z-Flag gelöscht ist.
Die zweite ist etwas interessanter. (Weil man noch etwas lernt. ;) )

Den Sprung selbst kann man nicht einfach noppen. Da an die Stelle (Sprungziel wird korrigiert) später noch geschrieben wird, leider auch über unsere Nops.

Wir müssen also etwas intelligenter patchen. Wir wollen nicht, dass gesprungen wird.

Wir sehen, dass zuvor ein AND EAX, EAX ausgführt wird.
Wir schauen nach, welche Flags AND mit einem DEFINIERTEN konstanten Wert immer gleich besetzt.
Wir sehen hier (vorletzte Spalte):
http://ref.x86asm.net/geek.html#x21

Dass das Overflow-Flag wird IMMER gelöscht, also auf Null gesetzt wird, nach JEDER AND Operation.

Wenn wir also den Jump auf ein JO (Jump if Overflow) ändern, dann wird unter keinen Umständen gesprungen.

Um das nun zu ändern, können wir leider nicht OllyDbgs Assemble-Funktion benutzen, da er für den Sprung eine andere Kodierung nimmt, die nicht die gleiche Instruktionsgröße hat. (Es gibt mehrere Kodierungen)
Das würde wieder schiefghen, wenn das Sprungziel im Nachhinein korrigiert wird.

Die Sprunginstruktion ist diesem Falle eine Two-Opcode Instruktion mit dem prefix 0x0F.

Wir schauen also in diese Tabelle und suchen JO.
http://sandpile.org/ia32/opc_2.htm

Und sehen, dass wir 0F84 in 0F80 ändern müssen. Und schon wird nie gesprungen, da nach einem AND das Overflow-Flag garantiert gelöscht ist.

Wie gesagt. Es geht noch einfacher. Aber nur mal als Anstoß für einen etwas anderen Ansatz. :wink:
 
Zuletzt bearbeitet:
Vielen herzlichsten Dank für deine ausführliche Hilfe.
Das war u.a. ein Teil, den ich bisher nicht durch Tutorials mir aneignen konnte!

Werde nächste Woche evtl. noch mehr uppen, wenn er bereits welche fertig hat, u.a. auch welche mit AutoIT.
Habe sie mir mal angeschaut, verstehe in denen aber nur Bahnhof...

PS: Netter Avatar :D:D
 
Wie versprochen habe ich hier noch ein Paar weitere!
Wobei ich schon wieder das gleiche Problem habe wie beim ersten CrackMe das mit Blitz3D compiliert wurde.
Finde zwar den jump im Debugger, aber komischerweise nicht im Hex :confused:

Und mit dem 2. hier, das mit AutoIT gemacht ist, sehe ich mal gar nicht durch, wenn mir jemand da auf die Sprünge helfen könnte, wäre ich sehr dankbar!

CrackMe 3:
http://www22.zippyshare.com/v/61757347/file.html

CrackMe 4:
http://www22.zippyshare.com/v/40127169/file.html

CrackMe 5:
http://www4.zippyshare.com/v/68570591/file.html

EDIT: sorry für den externen Hoster, aber habe leider ja schon durch die ersten beiden Anhänge das Limit fast erreicht oO
 
Zuletzt bearbeitet:
Wie versprochen habe ich hier noch ein Paar weitere!
Wobei ich schon wieder das gleiche Problem habe wie beim ersten CrackMe das mit Blitz3D compiliert wurde.
Finde zwar den jump im Debugger, aber komischerweise nicht im Hex :confused:

Und mit dem 2. hier, das mit AutoIT gemacht ist, sehe ich mal gar nicht durch, wenn mir jemand da auf die Sprünge helfen könnte, wäre ich sehr dankbar!

CrackMe 3:
http://www22.zippyshare.com/v/61757347/file.html

CrackMe 4:
http://www22.zippyshare.com/v/40127169/file.html

CrackMe 5:
http://www4.zippyshare.com/v/68570591/file.html

EDIT: sorry für den externen Hoster, aber habe leider ja schon durch die ersten beiden Anhänge das Limit fast erreicht oO


Au3 ist die Programmiersprache, die ich so ziemlich am besten kann - auch wenns mehr oder weniger als "schwache" Sprache gilt, hat die an sich zieeemlich viel Power. :)

AutoIt lässt sich aber witzigerweise komplett dekompilieren.

$INI = @WindowsDir & "\data.ini"
If Not FileExists($INI) Then
IniWrite($INI, "account", "user", _STRINGENCRYPT(1, "normaluser", "abc123", 5))
IniWrite($INI, "account", "pass", _STRINGENCRYPT(1, "system", "abc123", 5))
EndIf
$ORIGUSER = _STRINGENCRYPT(0, IniRead($INI, "account", "user", ""), "abc123", 5)
$ORIGPASS = _STRINGENCRYPT(0, IniRead($INI, "account", "pass", ""), "abc123", 5)
$INPUT1 = GUICtrlCreateInput("", 120, 144, 105, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_PASSWORD))
#region ### START Koda GUI section ### Form=
$FORM1 = GUICreate("CrackMe !!!", 313, 124, 277, 173)
$INPUT1 = GUICtrlCreateInput("", 128, 18, 153, 21)
$INPUT2 = GUICtrlCreateInput("", 128, 50, 153, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_PASSWORD))
$LABEL1 = GUICtrlCreateLabel("Erkennungscode:", 16, 18, 108, 23)
$LABEL2 = GUICtrlCreateLabel("Passwort:", 56, 50, 64, 23)
$LOGIN = GUICtrlCreateButton("Anmelden", 32, 90, 83, 25, 0)
$CANCEL = GUICtrlCreateButton("Abbrechen ", 160, 90, 113, 25, 0)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
$NMSG = GUIGetMsg()
Switch $NMSG
Case $GUI_EVENT_CLOSE
Exit
Case $LOGIN
If GUICtrlRead($INPUT2) = $ORIGPASS And GUICtrlRead($INPUT1) = $ORIGUSER Then
MsgBox(64, "Passwort korrekt", "Sie haben sich erfolgreich eingeloggt")
Exit
Else
MsgBox(48, "Passwort inkorrekt", "Sie haben das Passwort oder den Benutzernamen falsch eingegeben")
EndIf
Case $CANCEL
MsgBox(48, "Anmeldung Abbgebrochen", "Sie haben die Anmeldung abbgebrochen.", 3)
Exit
EndSwitch
WEnd

Und bei dem Blitz3D-Crackme (in der Sprache programmiere ich momentan auch sehr viel) habe ich das Passwort "aus versehen" erraten, beim erstem Versuch. :D


Edit: Das ist jetzt zwar nicht auf die herkömmliche Art und Weise gecracked, aber das macht einen Hacker ja erst aus, nach alternativen Wegen zu forschen. :D
 
Zuletzt bearbeitet:
Hab's raus!

Ich hab' das CrackMe auf eine ganz andere Art gelöst ;)

Durch Bruteforce habe ich bei meiner 2. Eingabe das PW "test" herausgekriegt. Es handelte sich dabei um manuelles Brute Forcing ;)
 
Zurück
Oben