Binary - Bomb- Phase 4
Ich bin mit einer sehr schwierigen Zeit der Verfolgung der Assembler-code für die folgenden binary-bomb (Ein Auftrag von der Schule, wo eine Bombe muss entschärft werden, diese Bombe enthält 6 Phasen, die alle mit 1 richtigen Eingang zu gehen, um die nächste phase). Ich bin derzeit auf phase_4 und es hat eine rekursive Funktion, die aufgerufen wird func4. Ich habe festgestellt, dass die Eingabe "%d %d", die zwei ganze zahlen. Aber, ich kann nicht ganz herausfinden, was func4 tut, auch nachdem man sich die info auf alle Register in jeder Phase.
Phase_4:
(gdb) disas
Dump of assembler code for function phase_4:
=> 0x08048e24 <+0>: sub $0x2c,%esp
0x08048e27 <+3>: lea 0x1c(%esp),%eax
0x08048e2b <+7>: mov %eax,0xc(%esp)
0x08048e2f <+11>: lea 0x18(%esp),%eax
0x08048e33 <+15>: mov %eax,0x8(%esp)
0x08048e37 <+19>: movl $0x804a7f1,0x4(%esp)
0x08048e3f <+27>: mov 0x30(%esp),%eax
0x08048e43 <+31>: mov %eax,(%esp)
0x08048e46 <+34>: call 0x80488d0 <__isoc99_sscanf@plt>
0x08048e4b <+39>: cmp $0x2,%eax
0x08048e4e <+42>: jne 0x8048e5d <phase_4+57>
0x08048e50 <+44>: mov 0x18(%esp),%eax
0x08048e54 <+48>: test %eax,%eax
0x08048e56 <+50>: js 0x8048e5d <phase_4+57>
0x08048e58 <+52>: cmp $0xe,%eax
0x08048e5b <+55>: jle 0x8048e62 <phase_4+62>
0x08048e5d <+57>: call 0x8049470 <explode_bomb>
0x08048e62 <+62>: movl $0xe,0x8(%esp)
0x08048e6a <+70>: movl $0x0,0x4(%esp)
0x08048e72 <+78>: mov 0x18(%esp),%eax
0x08048e76 <+82>: mov %eax,(%esp)
0x08048e79 <+85>: call 0x8048dbb <func4>
0x08048e7e <+90>: cmp $0x25,%eax
0x08048e81 <+93>: jne 0x8048e8a <phase_4+102>
0x08048e83 <+95>: cmpl $0x25,0x1c(%esp)
0x08048e88 <+100>: je 0x8048e8f <phase_4+107>
0x08048e8a <+102>: call 0x8049470 <explode_bomb>
0x08048e8f <+107>: add $0x2c,%esp
0x08048e92 <+110>: ret
End of assembler dump.
func4:
Breakpoint 2, 0x08048dbb in func4 ()
(gdb) disas
Dump of assembler code for function func4:
=> 0x08048dbb <+0>: sub $0x1c,%esp
0x08048dbe <+3>: mov %ebx,0x14(%esp)
0x08048dc2 <+7>: mov %esi,0x18(%esp)
0x08048dc6 <+11>: mov 0x20(%esp),%eax
0x08048dca <+15>: mov 0x24(%esp),%edx
0x08048dce <+19>: mov 0x28(%esp),%esi
0x08048dd2 <+23>: mov %esi,%ecx
0x08048dd4 <+25>: sub %edx,%ecx
0x08048dd6 <+27>: mov %ecx,%ebx
0x08048dd8 <+29>: shr $0x1f,%ebx
0x08048ddb <+32>: add %ebx,%ecx
0x08048ddd <+34>: sar %ecx
0x08048ddf <+36>: lea (%ecx,%edx,1),%ebx
0x08048de2 <+39>: cmp %eax,%ebx
0x08048de4 <+41>: jle 0x8048dfd <func4+66>
0x08048de6 <+43>: lea -0x1(%ebx),%ecx
0x08048de9 <+46>: mov %ecx,0x8(%esp)
0x08048ded <+50>: mov %edx,0x4(%esp)
0x08048df1 <+54>: mov %eax,(%esp)
0x08048df4 <+57>: call 0x8048dbb <func4>
0x08048df9 <+62>: add %eax,%ebx
0x08048dfb <+64>: jmp 0x8048e16 <func4+91>
0x08048dfd <+66>: cmp %eax,%ebx
0x08048dff <+68>: jge 0x8048e16 <func4+91>
0x08048e01 <+70>: mov %esi,0x8(%esp)
0x08048e05 <+74>: lea 0x1(%ebx),%edx
0x08048e08 <+77>: mov %edx,0x4(%esp)
0x08048e0c <+81>: mov %eax,(%esp)
0x08048e0f <+84>: call 0x8048dbb <func4>
0x08048e14 <+89>: add %eax,%ebx
0x08048e16 <+91>: mov %ebx,%eax
0x08048e18 <+93>: mov 0x14(%esp),%ebx
0x08048e1c <+97>: mov 0x18(%esp),%esi
0x08048e20 <+101>: add $0x1c,%esp
0x08048e23 <+104>: ret
End of assembler dump.
Ich war auch in der Lage, zu erkennen, dass die int größer als 0, aber anders als das, ich bin verloren.
Ist das überhaupt hilfreich? stackoverflow.com/q/18961406/56778. Suchen Sie hier nach "Binär-Bombe", oder schauen Sie sich einfach die Fragen auf der rechten Seite. ----------->
Ich würde nicht Fragen, wenn ich habe es gefunden in einem suchen.
Ist das überhaupt hilfreich? stackoverflow.com/q/18961406/56778. Suchen Sie hier nach "Binär-Bombe", oder schauen Sie sich einfach die Fragen auf der rechten Seite. ----------->
Ich würde nicht Fragen, wenn ich habe es gefunden in einem suchen.
InformationsquelleAutor petrov | 2013-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hoffe, es ist klar, dass
phase4
ist zu prüfen, dass die erste Zahl in der Reihe0
..14
inklusive (siehe Zeilen+44
..+57
)Dann ruft es
func4
mit drei Argumenten: die erste Zahl eingegeben,0
und14
(Linien+62
..+85
). Als Nächstes überprüft, ob der Rückgabewert ist0x25
(37 dezimal) auf der Linie+90
- und dass die zweite eingegebene Zahl auch37
(Linie+95
)Let ' s move on, um
func4
. Ich nenne drei Argumentex
,low
undhigh
. Zunächst wissen Sie nicht, was Sie sind, natürlich. Linien+23
..+34
berechnen(high - low) /2
. Die hässliche Sauerei ist, weil der compiler generiert code zur Behandlung von negativen zahlen mit Kürzung auf null. Wir werden nicht sehen, keine negativen zahlen obwohl. Linie+36
ist nur ein schicker Zusatz, so inebx
wir haben jetztlow + (high - low) /2
auch bekannt als der Durchschnitt der beiden zahlen. Der code vergleicht dann diesen Mittelwert der Anzahlx
wurde bereitgestellt, die als erstes argument. Linien+43
..+62
ausgeführt werden, wennx < average
und Sie aufrufenfunc4(x, low, average - 1)
und fügen Sie den zurückgegebenen Wert um den Durchschnitt. Ähnlich, Linien+70
..+89
ausgeführt werden, wennx > average
und berechnenaverage + func4(x, average + 1, high)
. Wennx == average
dann nur der Durchschnitt selbst wird zurückgegeben.Es ist im Grunde tun eine binäre Suche und fasst die Vermutungen, wie es geht. Da das Intervall hat 15 Elemente, die Sie benötigen wird, höchstens 4 Vermutungen. Die erste Vermutung sein wird
7
, damit man das gewünschte Ergebnis von37
wir müssen30
mehr. Wir haben höchstens 3 weitere versuche und alle Vermutungen werden entweder weniger als 7 oder mehr als 7. Da7 * 3 = 21
und das kann uns nicht30
es bedeutet, dass die Zahl größer als 7 ist. Zweite Vermutung ist, so werde sein(8 + 14) /2 = 11
, dass unsere Summe18
mit19
mehr zu gehen. Wenn die Zahl war vor 11 würde das bedeuten, dass wir über das Ziel, also die Zahl muss mehr als 7 und weniger als 11. Dritte Vermutung ist so(8 + 10) /2 = 9
was bringt die Summe bis zu27
mit10
mehr zu gehen, und nur ein einziges erraten, das bedeutet also, dass die Zahl10
.TL;DR: die korrekte Eingabe sollte
10
und37
Können Sie erklären, wie kommst du 0-14 ? ich bin verwirrt. Linie 52, %eax <= 14, so dass die erste variable ?
InformationsquelleAutor Jester