IOLI-crackme – 0x02

2019-04-22 von Mario

Auf der Website der University of California, Riverside (UCR) im Department of Computer Science and Engineering wird ein Kurs zum Thema “Security and privacy” angeboten. Dabei wird auch auf das Thema Reverse Engineering näher eingegangen. Es gilt, sieben Crackmes (IOLI-crackme) zu lösen.

 

Writeup Crackme0x02 

Als erstes das Programm “crackme0x02” ausführen. Daraufhin wird eine Passworteingabe verlangt, welches wir nicht kennen. Zum Testen einfach ein paar Buchstaben eingeben und mit Enter bestätigen.

./crackme0x02

Mit dem Befehl “file” kann geprüft werden, um welchen Dateityp es sich handelt.

file crackme0x02

In der Ausgabe wird der Dateityp ELF angezeigt. Mit einem weiteren UNIX-Programm, dem GNU Debugger, besteht die Möglichkeit, die Software in Maschinensprache anzeigen zulassen.

gdb ./crackme0x02
set disassembly-flavor intel
disas main

Der erste Befehlt “gdb ./crackme0x02” öffnet den GNU Debugger und ebenfalls die Datei “crackme0x02”. Mit dem darauf folgenden Befehl wird die Darstellung der Syntax auf Intel umgestellt. Als nächstes wird die “Main” Methode des “crackme0x02” zur Anzeige gebracht.

 

Der relevante Teil ist nach “call 0x804830c <scanf@plt>” zu finden. Die Funktion “scanf” liest die Tastatureingabe und im folgenden befindet sich die Berechnung des Passworts.

Code Beschreibung
mov DWORD PTR [esp+0x4], eax Der Wert von eax (zeigt auf [ebp-0x4]) und wird nach [esp+0x4] kopiert.
mov DWORD PTR [esp], 0x804856c Die Adresse 0x804856c (zeigt auf [ebp-0x4]) wird zum Stackpointer [esp] kopiert.
call 0x804830c <scanf@plt> Die Funktion scanf wird aufgerufen und der eingegebene Wert wird in [ebp-0x4] geschrieben.
mov DWORD PTR [ebp-0x8], 0x5a Der Basepointer [ebp-0x8] wird mit dem Hexadezimalwert “5a” (in Dezimal “90”) belegt.
mov DWORD PTR [ebp-0xc], 0x1ec Der Basepointer [ebp-0xc] wird mit dem Hexadezimalwert “1ec” (in Dezimal “492”) belegt.
mov edx, DWORD PTR [ebp-0xc] Der Wert von [ebp-0xc] (in Dezimal “492”) wird nach edx kopiert.
lea eax, [ebp-0x8] Mit lea (load effective address) wird in eax die Adresse von [ebp-0x8] (in Dezimal “90”) abgelegt.
add DWORD PTR [eax], edx Die Werte von edx (492) und eax (zeigt [ebp-0x8] (in Dezimal “90”)) werden addiert.

eax (582) = eax (90) + edx (492)

Da eax auf die Adresse [ebp-0x8] zeigt, wird der vorherige Wert 90 mit dem Wert 582 überschrieben.

mov eax, DWORD PTR [ebp-0x8] Der Wert von [ebp-0x8] (582) wird nach eax kopiert.
imul eax, DWORD PTR [ebp-0x8] Die Werte von [ebp-0x8] (582) und eax (582) werden multipliziert.

eax (338724) = eax (582) * [ebp-0x8] (582)

mov DWORD PTR [ebp-0xc], eax Der Wert von eax (338724) wird nach [ebp-0xc] kopiert.
mov eax, DWORD PTR [ebp-0x4] Die Passworteingabe ist in [ebp-0x4] abgelegt und wird nach eax kopiert.
cmp eax, DWORD PTR [ebp-0xc] Die Werte in [ebp-0xc9] (338724) und eax (Passworteingabe) werden verglichen.
jne 0x8048461 <main+125> Darauf folgt eine IF-Abfrage (Jump if not equal) und es wird eine Erfolgs- oder eine Fehlermeldung ausgegeben.

 

Das gesuchte Passwort lautet: 338724

 

Link zum Kurs: http://www.cs.ucr.edu/~csong/cs165/17/info.html

Download der Challenges: http://www.cs.ucr.edu/~csong/cs165/17/l/lab1.tar.bz2

Kategorie: IT-Security Schlagwörter: , ,