在 phase_defused中查各个地址,发现有“%d %d %s”,还有一个“DrEvil”,第四关输入的是两个整型,所以在第四关答案后面加上此字符串即可
通过查找,可以得到二叉树
综合分析:
- 首先,函数输入的是一串东西,后面通过调用另一个函数把它转换为数字
- 然后,把这个数减一和1000比较,大于则爆炸得知,这个数是小于等于1001的
- 调用fun7函数,第一个参数这是一个地址(从后面得知,这是二叉树的根),第二个参数即输入的数
- 根据fun7的汇编代码,可以推断出其逻辑和递归形式(详细内容分析和细节在注释里都写出来了)
int fun7(Node *p, int val) { if(p == NULL) return -1; if(p->value == val) return 0; else if(root->value > val) return 2 * fun7(*(p+4),val); else if(root->value < val) return 2 * fun7(*(p+8),val) + 1; }
- 后面返回值和7比较,不相等爆炸,即返回值应为7
- 通过返回值推断,7为奇数,只可能是2*3+1=7,调用的是root->value < val的情况,即走右子树,同时还得到第一层递归返回值是3;2*1+1=3,也是走右子树,第二层递归返回1;2*0+1=1,还是走右子树,第三层返回值为0,说明p->value == val。即val可由树根走这条路径查找得到,如图:为0x3e9,即1001!
测试结果:
四、实验结果(在虚拟机中,进行语法检查,编译,正确性检查的截图):