炸弹实验室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

这是func4的反汇编代码。而且我不确定我是否正确理解此功能。


我没有在这里编写phase_4的反汇编代码,但是它需要“%d%d”输入,并且第一个整数应该在1 <= x <4的范围内。因此它应该是1,2或3。寄存器%edi首先具有值7。调用func4之后,代码将0x10(%rsp)和%eax的值进行比较,因此我应该知道调用func4之后的%eax值。


我以为,反汇编的func4代码意味着


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

但是据我了解,我无法解决。例如,如果%rsp的原始地址为0x7fffffffd5a8,则该地址将变小,直到edi的值变为0。我发现0x7fffffffd56f的值为0-并且第一个func4调用结束-但之后的值为0x7fffffffd56e为也为0-因此第二个func4调用结束-并且所有寄存器都变为0,包括eax。


所以我认为第二个数字的答案是零,但是(1,0),(2,0),(3,0)总是爆炸。


你猜我在哪里错了,能帮上忙吗?


倚天杖
浏览 839回答 3
3回答

qq_慕圣0414050

我也是像上面那样理解的,可就是不对。请问最后解出来了吗?

米琪卡哇伊

在phase_4的反汇编代码中,esi设置为0x14(%rsp),这是phase_4的第二个输入,而edi设置为7。根据您的解释,func4(edi,esi)返回func4(edi-1,esi) )+ func4(edi-2,esi)+ esi。因此func4(7,esi)返回33 * esi。和phase_4比较0x10(%rsp)和eax。因此,phase_4的第一输入应为33 *(phase_4的第二输入)。我理解正确吗?
打开App,查看更多内容
随时随地看视频慕课网APP