Dr. Evil's Bombe (Binary Bomb Lab) | Teil 3
Die ersten zwei Phasen haben wir ja mittlerweile ganz gut gemeistert.
Probieren wir uns im dritten Teil an Phase 3.
Vorweg sei einmal gesagt, dass es für die Phase mehrere Lösungsmöglichkeiten gibt / geben kann.
Wenn wir uns nun einmal den ersten Teil der dritten Phase näher anschauen. Wieder einmal, habe ich ein wichtiges Kriterium gelb markiert. Von hier aus werden wir die Lösung Schritt für Schritt entwickeln.
Was bezweckt dieses Jump-Statement? Und warum ist es wichtig?
Das es wichtig ist liegt zum einen daran, dass danach sofort ein callq <explode_bomb> folgt und wie wir bereits wissen wollen wir den Aufruf dieser Methode unterbinden, da wir ja nunmal hier sind um die Bombe zu entschärfen.
Was hier gerade eigentlich vergleicht wurde ist ebenfalls sehr interessant. Gehen wir das mal Schritt weise an:
mov $0x4026bc,%esi
Wir sehen nach was wir darin finden mit folgendem Befehl: x/s $esi
Als Ergebnis erhalten wir: 0x4026bc: "%d %c %d"
Tada! Wir müssen also etwas wie: 5 x 20 (Beispielhaft gewählt) eingeben.
Somit können wir uns über n (next instruction) durch klicken bis:
cmp DWORD PTR [rsp+0xc],0x7
Falls ich bis hier noch nicht erwähnt haben sollte, dass wir meistens im Register RSP unsere Eingaben finden (oft sogar noch mit Offset) dann habe ich dies so eben getan.
D.h. wir finden in rsp+0xc unsere 5. Wir können dies mit dem Befehl x (examine) erreichen, da wir hier ein Pointer vor uns haben.
x/d $rsp+0xc
Also wir vergleichen nun unsere Eingabe auf den Wert 7. Allerdings folgt danach ein Jump-Above welches wir nicht auslösen möchten da wir sonst sofort unsere allseits bekannte Methode explode_bomb aufrufen würden.
Wir schließen daraus, dass unsere Zahl <= 7 sein muss. In diesem Fall begnügen wir uns damit, dass wir mit der Zahl 5 einen soliden und richtigen Treffer gelandet haben.
Unsere erste Zahl (sprich die 5) beeinflusst unsere weitere Vorgehensweise und somit unsere Lösung. In diesem Fall springen wir mit Hilfe unserer 5 anfolgenden Befehl ( zunächst aber noch den 2. Teil der dritten Phase als Assembler Code )
Wir befinden uns an Adresse 4010fa
Dort finden wir unser benötigtes "Compare".
cmp DWORD PTR [rsp+0x8],0x100
Unsere letzte Zahl (sprich unsere 20) wird nun mit 0x100 verglichen.
Da wir ja alle im alltäglichen Leben nichts anderes tun außer Hex in Dezimal umzurechnen erkennt unser trainiertes Auge natürlich sofort, dass es sich hierbei um die Zahl 256 handelt.
Jetzt müssen wir nur noch das Geheimnis unseres Buchstaben lösen.
Wir kommen wie bereits bekannt per "n" weiter und gelangen zum letzten Vergleich:
cmp al,BYTE PTR [rsp+0x7]
Wir können uns per p/d $al einmal das Register ausgeben lassen uns sehen eine 108. Dies können wir in der ASCII Tabelle nachschlagen und sehen es ist ein kleines "L".
Somit hätten wir Phase 3 ebenfalls erfolgreich abgeschlossen!
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!)
Probieren wir uns im dritten Teil an Phase 3.
Vorweg sei einmal gesagt, dass es für die Phase mehrere Lösungsmöglichkeiten gibt / geben kann.
Wenn wir uns nun einmal den ersten Teil der dritten Phase näher anschauen. Wieder einmal, habe ich ein wichtiges Kriterium gelb markiert. Von hier aus werden wir die Lösung Schritt für Schritt entwickeln.
Erster Teil der Phase 3 |
Das es wichtig ist liegt zum einen daran, dass danach sofort ein callq <explode_bomb> folgt und wie wir bereits wissen wollen wir den Aufruf dieser Methode unterbinden, da wir ja nunmal hier sind um die Bombe zu entschärfen.
Was hier gerade eigentlich vergleicht wurde ist ebenfalls sehr interessant. Gehen wir das mal Schritt weise an:
- Zuvor wurde die Methode sscanf aufgerufen ( C++ Reference ).
- Danach wurde %eax mit $0x2 verglichen
On success, the function returns the number of items in the argument list successfully filled. This count can match the expected number of items or be less (even zero) in the case of a matching failure.In the case of an input failure before any data could be successfully interpreted, EOF is returned.Was wir daraus schließen können ist, dass wir mindestens drei Zeichen/Zahlen oder sonst etwas eingeben müssen. Um endlich herauszufinden wie wir wirklich unsere Eingabe formatieren müssen werfen wir einen Blick in das Register %esi sobald folgender Befehl ausgeführt wurde:
mov $0x4026bc,%esi
Wir sehen nach was wir darin finden mit folgendem Befehl: x/s $esi
Als Ergebnis erhalten wir: 0x4026bc: "%d %c %d"
Tada! Wir müssen also etwas wie: 5 x 20 (Beispielhaft gewählt) eingeben.
Somit können wir uns über n (next instruction) durch klicken bis:
cmp DWORD PTR [rsp+0xc],0x7
Falls ich bis hier noch nicht erwähnt haben sollte, dass wir meistens im Register RSP unsere Eingaben finden (oft sogar noch mit Offset) dann habe ich dies so eben getan.
D.h. wir finden in rsp+0xc unsere 5. Wir können dies mit dem Befehl x (examine) erreichen, da wir hier ein Pointer vor uns haben.
x/d $rsp+0xc
Also wir vergleichen nun unsere Eingabe auf den Wert 7. Allerdings folgt danach ein Jump-Above welches wir nicht auslösen möchten da wir sonst sofort unsere allseits bekannte Methode explode_bomb aufrufen würden.
Wir schließen daraus, dass unsere Zahl <= 7 sein muss. In diesem Fall begnügen wir uns damit, dass wir mit der Zahl 5 einen soliden und richtigen Treffer gelandet haben.
Unsere erste Zahl (sprich die 5) beeinflusst unsere weitere Vorgehensweise und somit unsere Lösung. In diesem Fall springen wir mit Hilfe unserer 5 anfolgenden Befehl ( zunächst aber noch den 2. Teil der dritten Phase als Assembler Code )
Teil 2 von Phase 3 |
Wir befinden uns an Adresse 4010fa
Dort finden wir unser benötigtes "Compare".
cmp DWORD PTR [rsp+0x8],0x100
Unsere letzte Zahl (sprich unsere 20) wird nun mit 0x100 verglichen.
Da wir ja alle im alltäglichen Leben nichts anderes tun außer Hex in Dezimal umzurechnen erkennt unser trainiertes Auge natürlich sofort, dass es sich hierbei um die Zahl 256 handelt.
Jetzt müssen wir nur noch das Geheimnis unseres Buchstaben lösen.
Teil 3 von Phase 3 |
Wir kommen wie bereits bekannt per "n" weiter und gelangen zum letzten Vergleich:
cmp al,BYTE PTR [rsp+0x7]
Wir können uns per p/d $al einmal das Register ausgeben lassen uns sehen eine 108. Dies können wir in der ASCII Tabelle nachschlagen und sehen es ist ein kleines "L".
Somit hätten wir Phase 3 ebenfalls erfolgreich abgeschlossen!
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
Kommentar veröffentlichen