Tan's Blog.

Challenge:Phase4

字数统计: 385阅读时长: 1 min
2019/04/18 Share

Phase4

解题步骤

Phase4有两段主要代码,分别为、<phase_4>,在<phase_4>中调用了。首先查看一些输入的格式,同上题一样,都是两个数。

但这道题和上一道题输入的顺序不同,初始化栈操作的顺序做了调整,输入的第一个数放在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
25
int 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,修改好这一块输出就对了。

CATALOG
  1. 1. Phase4
    1. 1.1. 解题步骤
    2. 1.2. 总结