Phase4
解题步骤
Phase4有两段主要代码,分别为
但这道题和上一道题输入的顺序不同,初始化栈操作的顺序做了调整,输入的第一个数放在0x1C(%esp),第二个数放在0x18(%esp)。假设输入的数为a b,8048d3e处做判断:b-2≦2,不成立会爆炸,这里我设d=3。下面开始调用func4(8,3)。进入func4可以看到有许多call func4语句,推测为递归调用。func4的功能是计算a的值,根据func4的汇编代码写C++程序,计算a的值。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25int func4(int a,int b){
int ebx=a;
int esi=b;
int eax,eax1,eax2,edi;
if(ebx==0){
eax=0;
}
else{
eax=esi;
if(ebx!=1){
eax1=func4(ebx-1,esi);
edi=esi+eax1;
eax2=func4(ebx-2,esi);
eax=eax2+edi;
}
}
return eax;
}
int main(){
int a=8;
int b=3;
cout<<func4(a,b)<<endl;
return 1;
}
得出结果
将a b输入,解除炸弹。
总结
对Phase4用到的汇编指令总结
操作名称 | 作用 |
---|---|
JBE | 不高于跳转 |
JLE | 不大于则转移 |
LEA | 取地址至寄存器 |
MOVL | 传32位寄存器值 |
RET | 返回地址出栈 |
TEST | 两个操作数进行逻辑与运算 |
今天卡在lea (%eax,%esi,1),%edi这条指令上,导致一直算不出来正确结果,这条指令的大致意思是%edi=%eax+%esi* 1,修改好这一块输出就对了。