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