Assembly 炸弹实验室第四阶段

Assembly 炸弹实验室第四阶段,assembly,reverse-engineering,x86-64,Assembly,Reverse Engineering,X86 64,但以我的理解,我无法解决它。 例如,如果%rsp的原始地址是0x7fffffffd5a8 然后地址将变小,直到edi的值变为0。 我发现0x7FFFFFD56F的值是0-并且第一个func4调用结束- 但是在0x7FFFFFD56E的值也是0之后-因此第二个func4调用结束- 所有寄存器都变为0,包括eax 所以我认为第二个数字的答案是零, 但是(1,0),(2,0),(3,0)总是会引爆炸弹 你猜到我错在哪里了吗?edi和esi是func4的两个参数。这是根据标准调用约定,但也可以从以下事实

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

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


你猜到我错在哪里了吗?

edi
esi
func4
的两个参数。这是根据标准调用约定,但也可以从以下事实推断:这些寄存器在使用时没有初始化,因此它们的值必须来自外部。因此,原型是
intfunc4(inta,intb)

+23
检查
a>0
,如果是,则跳开。因此,我们可以很容易地跟踪条件为假时发生的情况:


if(a请仔细检查您的反汇编,它有一些无意义的部分指示复制粘贴错误。例如
ebp
缺少
%
,或者
$px18
,而不是假定的
$0x18
。很难判断您是否提供了正确的实际代码。@Jester我看到了您的评论,您是对的。有几个问题我的反汇编代码中有错误,我正确地更改了它们。谢谢你告诉我这一点。好的,现在你应该相应地更新你的伪代码;)我也检查了我的伪代码,但没有任何错误。(我更改了一些单词,因为可读性,但无论如何…)如果伪代码是错误的,那么可能我误解了它缺少的某些内容,例如行
+21
,它确实是
ebp=esi
。旁注:知道
edi
esi
是传递给函数的前两个参数很有帮助。在阶段4的反汇编代码中,esi设置为0x14(%rsp),这是第四阶段的第二个输入,edi设置为7。根据您的解释,func4(edi,esi)返回func4(edi-1,esi)+func4(edi-2,esi)+esi。所以func4(7,esi)返回33*esi。第四阶段比较0x10(%rsp)和eax。所以第四阶段的第一个输入应该是33*(第四阶段的第二个输入).我理解正确了吗?哦,我解决了第四阶段!谢谢你的回答。我真的很感谢你给我的所有帮助:)
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
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