Eine lange überfällige Darstellung im Bereich vom Reverse Engineering

Bei der Gelegenheit des 9. Jahrestags Speedos zweiten Crackmes, schließlich erfülle ich mein Versprach einen Lösungsweg darzustellen. Damit wünscht man, ein erneuertes Interesse auf dieses Fach erwecken zu können.

Natürlich der Zweck in diesem Crackme ist es, den Programfluß nach Addresse 401428h (unter Windows XP, SP3) zu führen, damit die Message "gewonnen, glueckwunsch!" in Bildschirm erzeugen wird. Dafür muß man künftig die Bedingung DWORD PTR [EBP-4]=00000011h bei Addresse 401422 erlangen.




Jedesmal der Benutzer eine Taste zur Funktion getch (beim Addresse 4013DFh) drückt, wird die 1-Byte Eingabe durch den Ablauf bei Addresse 401290h verarbeitet (s. Opcode bei 40130Fh) und ausgeprüft (s. Opcode 401379h). Man kann allerdings diesen ausgeruften Ablauf als der Kernelablauf betrachten.

Hier die Vergleichung wird scheitern weil die Engabe 'L' zu den verarbeiteten [EBP-4]=0F2h führt, indem das Crackme einen Wert 0E4h für die zweiten Position erwartet.
Im Kernelablauf die Vergleichung zwischen jeder verarbeiteten 1-Byte Eingabe und dem erwarteten Wert bestimmt, ob EAX als erfolgsandeutend 1h oder scheitersandeutend 0h erstellt wird. Der erwartete Wert ist vom jeden einzelnen Offset des Kennworts (00h-bis 0Fh) abhängig. So bald EAX=0 aus dem Kernelablauf erzeugt, dann wird "game over :(" in Bildschirm ausgegeben sein. Anders wird der Benutzer erlaubt, die nächste Taste zu drücken und danach der Kernelablauf wiedermal ausgeführt wird. Wenn diese Schlage sechzehn mal erfolgt, dann wird die Message "gewonnen" ausgedrückt. Daher die obengennante Bedingung, daß [EBP-4] 11h sei. Siehe Anweisungen bei Addressen 4013D9h und 401422h.

Der Kernelablauf aus zwei wichtige Sektionen besteht. Die Anweisungsreihe von Addressen 4012A4h bis 401308h entspricht zur Eingabeverarbeitung, obgleich der erwartete Wert mittels Anweisungen von 401312h bis 401356h gerechnet wird.

Beide Anweisungsreihen im Kernelablauf sind sehr kompliziert. Glücklicherweise kein eingehendes Verständnis dieser Anweisungsreihen notwendig ist, da man braucht nur den Inhalt bei den Addressen [EBP-4] und [EBP-8] überwachen. Zwar beim Addresse EBP-4 (22FF44h) steht das Verarbeitungsergebnis, das von der abgeschickten Eingabe gelangt. Ebenfalls wird der erwartete Wert beim Addresse EBP-8 (22FF40h) gespeichert. Daher wird es überaus hilfreich eine Tafel schaffen, wobei man das Verarbeitungergebnis jeder möglichen Eingabe registriert. Dann solche Tafel ist:



TasteAsciiVerarbeitungsergebnis
232h33Ch
333h127h
737h36Dh
838h0BBh
A41h227h
B42h71h
C43h0Fh
D44h30h
E45h0E4h
F46h0AEh
L4Ch0F2h
O4Fh1DFh
Q51h368h
Z5Ah192h
andersetw.0FFFFFFFh


Dahingegen man muß auch den erwarteten Wert für jeden Offset des Kennworts aufmerken. Beispielsweise, am Ende der ersten Ausführung der Kernelroutine, [22FF40h] ist 0000000368h. Unser Tafel anblickend, man beachtet, daß Eingabe 'Q' zu das Verarbeitungsergebnis führt. Also erfindet man, daß das Kenwort soll mit 'Q' anfangen. Während der zweiten Schlage wird 000000E4h ins [22FF40h] erstellt (dazu Eingabe 'E' entspricht), usw.


Die einzige Eingabesreihe, die zur erfolgreichen Message führt, ist QEL3BZAD7F8C2Z8OD.



Da Speedos Crackme die getch Funktion benutzt, es ist unmöglich die erfolreichen Message durch Buffer Overflow erlangen. Bei diesen Fach ansetze ich hier.


Iñaki Viggers

No comments:

Post a Comment