Dr. Evil's Bombe (Binary Bomb Lab) | Teil 2

Im letzten Teil hatte ich Phase 1 näher erläutert. In diesem Teil widmen wir uns der 2. Phase der Binary Bomb.
Ich werde hier näher auf das Erreichen der Lösung sowie die notwendigen Kniffe dafür eingehen.



Lassen wir uns zunächst einmal die 2. Phase disassemblieren.
Phase 2 disassembliert
Wie ihr bereits sehen könnt, wurde bereits etwas gelb markiert. Das sollte zunächst unser Hauptaugenmerk sein.

read_six_numbers (Englisch für: lese_sechs_nummern) wie wir uns bereits denken können, werden hier 6 Zahlen von uns erwartet. Um zu wissen wie genau das Eingabeformat lautet, könnte man die Adresse 0x402989 (mov Befehl in Zeile: 401774) sich genauer anschauen.

read_six_numbers





















Dort würde man etwas wie "%d %d %d %d %d %d" finden. Das bedeutet, dass wir 6 Zahlen brauchen die jeweils mit einem Leerzeichen getrennt sind.

Nun können wir einfach eine Eingabe tätigen die natürlich für uns eindeutig ist. Wie z.B.: "1 2 3 4 5 6". Allerdings könnten wir auch hier schnell einen Blick auf die CMP-Befehle werfen. Unsere Eingabe ist ein DWORD PTR[rsp] wenn wir nun einen Befehl gefunden haben der dies enthält, könnte dieser so aussehen:

CMP DWORD PTR[rsp], 0x0

(Anmerkung: Es ist auch möglich das bei euch die Register anders belegt sind, da ihr womöglich eine andere Version besitzt. Allerdings, ist das Vorgehen ziemlich identisch)

Aus diesem Befehl können wir lesen, das unsere erste Zahl mit einer 0 verglichen wird.
Das bedeutet, dass unsere erste Zahl eine 0 sein muss!

Weiter geht es zum nächsten CMP-Befehl.

CMP DWORD PTR[rsp+0x4], 0x1

Dieser Befehl ist der Vergleich unserer zweiten Zahl auf die 1. Somit haben wir wenn wir uns die bisherigen Zahlen als Array denken folgendes:

zahl[0] = 0
zahl[1] = 1
zahl[2] = ?
zahl[3] = ?
zahl[4] = ?
zahl[5] = ?

D.h. wir haben somit die Startwerte herausgefunden. Da es uns ja auch nicht gleich zu einfach gemacht wird wie es in Phase 1 der Fall war wird es nun etwas kniffliger.

Um zu verstehen, was nun passiert sehen wir uns den entsprechenden Assembler Code genauer an. Ich habe hier das vorbereiten der Register weglassen.


mov    eax,DWORD PTR [rsp+rax*4]       ; Laden der (n - 2).ten Zahl

add    eax,DWORD PTR [rsp+rcx*4]        ; (n-2) + (n-1) (wobei n für n.te Zahl steht)

cmp    DWORD PTR [rsp+rdx*4],eax       ; Vergleich des Ergebnisses mit der n.ten Zahl unserer Eingabe
je     40101d <phase_2+0x44>                  ; Wenn Zahlen identisch sind entkomme dem explode_bomb
call   40171a <explode_bomb>                ; Böse, das wollen wir nicht

Dieses Stück Code wird über unsere komplette Eingabe wiederholt.
Wenn wir aber die Oben gegebene Funktion mal stupide anwenden, können wir unser "Array" füllen:

zahl[0] = 0
zahl[1] = 1
zahl[2] = 1
zahl[3] = 2
zahl[4] = 3
zahl[5] = 5

Da vermutlich jeder von euch in der Schule oder sonst wo ausreichend mit mathematischen Zusammenhängen gequält wurde, sollte jeder von euch sofort erkennen können, dass es sich hier um die Fibonacci Zahlen handelt. Also probieren wir unsere Eingabe mal aus:

0 1 1 2 3 5

Und siehe da, es hat geklappt! Phase 2 gelöst!
Hier geht's weiter zu Phase 3!

Webseite: http://r3d-soft.de
Web-YouTube Downloader: http://youtube.r3d-soft.de
MediaDownloader als Programm: http://download.r3d-soft.de (Downloade Musik, Videos und vieles mehr!)

Kommentare

Beliebte Posts aus diesem Blog

[ENGLISH] Capture the Flag at UCF - Write Up - Crypto - XORLY

Dr. Evil's Bombe (Binary Bomb Lab) | Teil 1