Bomb lab phase_4

Dump of assembler code for function func4
    <+0>: mov %rbx,-0x18(%rsp)
    <+5>: mov %rbp, -0x10(%rsp)
    <+10>: mov %r12,-0x8(%rsp)
    <+15>: sub $0x18,%rsp
    <+19>: mov %edi,%ebx
    <+21>: mov %esi,%ebp
    <+23>: test %edi, %edi
    <+25>: jg 0x400fb2<func4+34>
    <+27>: mov $0x0,%ebp
    <+32>: jmp 0x400fd2<func4+66>
    <+34> cmp $0x1, %edi
    <+37>: je 0x400fd2<func4+66>
    <+39>: lea -0x1(%rbx),%edi
    <+42>: callq 0x400f90 <func4>
    <+47>: mov %eax,%r12d
    <+50>: lea -0x2(%rbx),%edi
    <+53>: mov %ebp,%esi
    <+55>: callq 0x400f90 <func4>
    <+60>: lea (%r12,%rax,1),%eax
    <+64>: add %eax,ebp
    <+66>: mov %ebp, %eax
    <+68>: mov (%rsp),%rbx
    <+72>: mov 0x8(%rsp), %rbp
    <+77>: mov 0x10(%rsp),%r12
    <+82>: add $0x18,%rsp
    <+86>: retq

Dies ist der disassemblierte Code von func4. Und ich bin mir nicht sicher, ob ich diese Funktion richtig verstanden habe oder nicht.

Ich habe den disassemblierten Code von phase_4 hier nicht geschrieben, aber es muss "% d% d" eingegeben werden, und die erste Ganzzahl sollte im Bereich 1 <= x <4 liegen. Also sollte es 1,2 oder 3 sein. Und register% edi hat zuerst den Wert 7. Nach dem Aufruf von func4 vergleicht der Code den Wert von 0x10 (% rsp) und% eax. Also sollte ich den Wert von% eax nach dem Aufruf von func4 kennen.

Ich dachte, disassemblierter Code von func4 bedeutet

put the stack
ebx = edi
ebp = esi
if edi is not zero
    if edi is one: then eax=ebp.
                   rearrange the stack
                   return.
    else: edi = -0x1(rbx)
          func4
          r12d = eax
          edi = -0x2(rbx)
          esi = ebp
          func4
          eax = rax+r12+ebp
          rearrange the stack and return.
else
    ebp=0
    eax=ebp
    return

Aber nach meinem Verständnis kann ich es nicht lösen. Wenn zum Beispiel die ursprüngliche Adresse von% rsp 0x7fffffffd5a8 war, dann wäre die Adresse kleiner, bis der Wert von edi 0 wird. Ich habe festgestellt, dass der Wert von 0x7fffffffd56f 0 ist - und der erste func4-Aufruf endet -, aber nach diesem Wert von 0x7fffffffd56e ist auch 0 - so endet der zweite func4-Aufruf - und alle Register werden zu 0, einschließlich eax.

So dachte ich die Antwort der zweiten Zahl ist Null, aber (1,0), (2,0), (3,0) explodiert immer Bombe.

Haben Sie erraten, wo ich falsch liege und helfen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage