计算机系统_炸弹(boom)实验/逆向工程实验(phase_5)

第五关

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

 

 


猜你喜欢

转载自blog.csdn.net/Xindolia_Ring/article/details/80313670