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. |
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:
Taste | Ascii | Verarbeitungsergebnis |
---|---|---|
2 | 32h | 33Ch |
3 | 33h | 127h |
7 | 37h | 36Dh |
8 | 38h | 0BBh |
A | 41h | 227h |
B | 42h | 71h |
C | 43h | 0Fh |
D | 44h | 30h |
E | 45h | 0E4h |
F | 46h | 0AEh |
L | 4Ch | 0F2h |
O | 4Fh | 1DFh |
Q | 51h | 368h |
Z | 5Ah | 192h |
anders | etw. | 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