第五关
0000000000401002 <phase_5>:
401002: 48 83 ec 18 sub $0x18, %rsp
401006: 48 8d 4c 24 08 lea 0x8(%rsp), %rcx
40100b: 48 8d 54 24 0c lea 0xc(%rsp), %rdx
401010: be be 1e 40 00 mov $0x401ebe, %esi
401015: b8 00 00 00 00 mov $0x0, %eax
40101a: e8 91 fa ff ff callq 400ab0 <__isoc99_sscanf@plt>
40101f: 83 f8 01 cmp $0x1, %eax //大于1
401022: 7f 05 jg 401029<phase_5+0x27> **
401024: e8 14 06 00 00 callq 40163d <explode_bomb>
/**
* 首先来看汇编代码,经过前面几关很容易就可以看到熟悉的对栈开辟空间,
* 以及调用sscanf函数,第一个参数在0xc(%rsp)第二个参数在
*0x8(%rsp),调用sscanf后返回值表示输入的数的个数要大于1. **
* 看到有ebx和esi考虑下面的情况中有循环或者数组。
**/
//对输入的数进行操作
401029: 8b 44 24 0c mov 0xc(%rsp), %eax
40102d: 83 e0 0f and $0xf, %eax
401030: 89 44 24 0c mov %eax, 0xc(%rsp)
401034: 83 f8 0f cmp $0xf, %eax
401037: 74 2c je 401065<phase_5+0x63> //<explode_bomb>
//将输入的第一个参数的低四位取出来,不能全部为1;存到%eax
401039: b9 00 00 00 00 mov $0x0, %ecx //置初始值为0
40103e: ba 00 00 00 00 mov $0x0, %edx
/**
* 这里有一个循环
*
* 但是这里有一个需要注意的地方,我们输入的第一个数eax用来被计算偏移下标了。
* 也就是说下标不是连续的。每次取出来的元素的值用到下一次去数组元素时计算下标。
* 可以看到ecx寄存器是一个累加器,先赋值为零,然后用来保存数组元素的和,
* 然后edx用来循环计数,在这里,只要取到的数组中元素不为15就继续循环累加求和,
* 可以看出数组中有一个元素是15,,然后ebx作为的是数组的首地址,
* 是有立即数0x804a1c0中,所以可知已知数组存在这个地址中。
**/
401043: 83c2 01 add $0x1, %edx //加一计数 $
401046: 4898 cltq
401048: 8b04 85 a0 1b 40 00 mov 0x401ba0(, %rax, 4), %eax
//取数组元素
40104f: 01c1 add %eax, %ecx
401051: 83f8 0f cmp $0xf, %eax
401054: 75ed jne 401043<phase_5+0x41> $
401043: 83c2 01 add $0x1, %edx //加一计数 $
401046: 4898 cltq
401048: 8b04 85 a0 1b 40 00 mov 0x401ba0(, %rax, 4), %eax
//取数组元素
40104f: 01c1 add %eax, %ecx
401051: 83f8 0f cmp $0xf, %eax
401054: 75ed jne 401043<phase_5+0x41> $
401056: 89 44 24 0c mov %eax, 0xc(%rsp)
40105a: 83 fa 0c cmp $0xc, %edx
40105d: 75 06 jne 401065<phase_5+0x63>
//<explode_bomb>
40105f: 3b 4c 24 08 cmp 0x8(%rsp), %ecx
//输入的第二个数,要等于ecx->等于累加后的和
401063: 74 05 je 40106a<phase_5+0x68>
401065: e8 d3 05 00 00 callq 40163d <explode_bomb>
40106a: 48 83 c4 18 add $0x18, %rsp
这题也是要求你输入两个数字, 然后第一个数字只保留后四位,其他位置0
and $0xf, %eax
综上,edx用于循环次数的计数,那么这里必须要进行15次,另外可以看到我们输入的数参数二,要等于ecx,也就是要等于累加之后的结果。
那么就要首先将数组中的首地址里面存的数值取出来
可以发现输入7时,可以满足取出15时要edx为12,此时ecx为93。
所以答案为 7 93