计算机系统基础课程实验课bomb--phase_4
首先还是栈指针减24,应该也是为了存储多个值
然后和phase_3一样,把输入的值放在了%rcx和%rdx
输入格式也和phase_3一样,如图
然后将返回值与2作比较,如果不等于2就爆炸,所以只能输入两个数字

然后将第一个输入值d1与14作比较,如果d1<=14就跳转,否则就爆炸


跳转之后把14放入%edx,0放入%esi,d1放入%edi,并调用函数func4
现在跳到func4继续看反汇编代码
首先栈指针减8,把14放入%eax,并自减0,然后%ecx被放入14,%ecx继续逻辑右移31位,接着%eax+=%ecx再另%eax>>=1,最后ecx = rsi + rax = esi + ( ( edx -esi ) >> 31 + ( edx - esi ) ) / 2, 将%ecx与%rdi比较,如果%rdi<%ecx,就让%edx = %rcx-1,然后回到函数开头形成递归,否则另%eax返回值为0,但还会继续判断%edi和%ecx的大小,如果%ecx>=%edi才能真正返回0,否则还是要回到开头递归,结合上面%ecx<=%rdi,说明%ecx要等于%rdi才能退出返回0完成关卡
随后回到phase_4,比较0和返回值,不等于0的话就爆炸,说明返回值为0,所以回到func4,经过第一次计算,%ecx的值可以得到是7,然后是否要继续递归还要取决于d1的值,如果%rdi=7,func4就返回0,成功过关,但如果继续递归,如果%rdi小于7,%edx就等于6,%rcx就等于3,如果%rdi等于3一样可以过关,推理下去,%rdi还可以等于1和0
所以答案就为
7 0
或
3 0
或
1 0
或
0 0

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)