• bomb lab 二三阶段


    phase_2

    函数phase_2代码如下

       0x0000000000400efc <+0>:     push   %rbp
       0x0000000000400efd <+1>:     push   %rbx
       0x0000000000400efe <+2>:     sub    $0x28,%rsp
       0x0000000000400f02 <+6>:     mov    %rsp,%rsi
       0x0000000000400f05 <+9>:     callq  0x40145c <read_six_numbers>
       0x0000000000400f0a <+14>:    cmpl   $0x1,(%rsp)
       0x0000000000400f0e <+18>:    je     0x400f30 <phase_2+52> #第一个数据为1
       0x0000000000400f10 <+20>:    callq  0x40143a <explode_bomb>
       0x0000000000400f15 <+25>:    jmp    0x400f30 <phase_2+52>
        # 循环开始
       0x0000000000400f17 <+27>:    mov    -0x4(%rbx),%eax
       0x0000000000400f1a <+30>:    add    %eax,%eax
       0x0000000000400f1c <+32>:    cmp    %eax,(%rbx)
       0x0000000000400f1e <+34>:    je     0x400f25 <phase_2+41>
       0x0000000000400f20 <+36>:    callq  0x40143a <explode_bomb>
       0x0000000000400f25 <+41>:    add    $0x4,%rbx
       0x0000000000400f29 <+45>:    cmp    %rbp,%rbx
       0x0000000000400f2c <+48>:    jne    0x400f17 <phase_2+27>
       0x0000000000400f2e <+50>:    jmp    0x400f3c <phase_2+64>
       0x0000000000400f30 <+52>:    lea    0x4(%rsp),%rbx
       0x0000000000400f35 <+57>:    lea    0x18(%rsp),%rbp
       0x0000000000400f3a <+62>:    jmp    0x400f17 <phase_2+27>
       0x0000000000400f3c <+64>:    add    $0x28,%rsp
       0x0000000000400f40 <+68>:    pop    %rbx
       0x0000000000400f41 <+69>:    pop    %rbp
       0x0000000000400f42 <+70>:    retq
    

    需要读入六个数据,输入指令x /d $rsp+n*4可以看到依次存放了六个数据。18行表明第一个数据必须是1,接下来是一个循环,52,57是数组循环初始化,让rbp指向最后一个数据的后一个空间,当rbx达到rbp时可以认定循环结束。eax中存放了前一个数的两倍,rbx中存放了当前数的内存,所以该段代码的意思是每个数都是前一个数的两倍即可避免爆炸,因此答案是1,2,4,8,16,32

    phase_3

    phase_3代码如下

       0x0000000000400f43 <+0>:     sub    $0x18,%rsp
       0x0000000000400f47 <+4>:     lea    0xc(%rsp),%rcx
       0x0000000000400f4c <+9>:     lea    0x8(%rsp),%rdx
       0x0000000000400f51 <+14>:    mov    $0x4025cf,%esi
       0x0000000000400f56 <+19>:    mov    $0x0,%eax
       0x0000000000400f5b <+24>:    callq  0x400bf0 <__isoc99_sscanf@plt>
       0x0000000000400f60 <+29>:    cmp    $0x1,%eax
       0x0000000000400f63 <+32>:    jg     0x400f6a <phase_3+39>
       0x0000000000400f65 <+34>:    callq  0x40143a <explode_bomb>
       0x0000000000400f6a <+39>:    cmpl   $0x7,0x8(%rsp)
       0x0000000000400f6f <+44>:    ja     0x400fad <phase_3+106>
       0x0000000000400f71 <+46>:    mov    0x8(%rsp),%eax
       0x0000000000400f75 <+50>:    jmpq   *0x402470(,%rax,8)
       0x0000000000400f7c <+57>:    mov    $0xcf,%eax
       0x0000000000400f81 <+62>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400f83 <+64>:    mov    $0x2c3,%eax
       0x0000000000400f88 <+69>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400f8a <+71>:    mov    $0x100,%eax
       0x0000000000400f8f <+76>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400f91 <+78>:    mov    $0x185,%eax
       0x0000000000400f96 <+83>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400f98 <+85>:    mov    $0xce,%eax
       0x0000000000400f9d <+90>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400f9f <+92>:    mov    $0x2aa,%eax
       0x0000000000400fa4 <+97>:    jmp    0x400fbe <phase_3+123>
       0x0000000000400fa6 <+99>:    mov    $0x147,%eax
       0x0000000000400fab <+104>:   jmp    0x400fbe <phase_3+123>
       0x0000000000400fad <+106>:   callq  0x40143a <explode_bomb>
       0x0000000000400fb2 <+111>:   mov    $0x0,%eax
       0x0000000000400fb7 <+116>:   jmp    0x400fbe <phase_3+123>
       0x0000000000400fb9 <+118>:   mov    $0x137,%eax
       0x0000000000400fbe <+123>:   cmp    0xc(%rsp),%eax
       0x0000000000400fc2 <+127>:   je     0x400fc9 <phase_3+134>
       0x0000000000400fc4 <+129>:   callq  0x40143a <explode_bomb>
       0x0000000000400fc9 <+134>:   add    $0x18,%rsp
       0x0000000000400fcd <+138>:   retq
    

    29行可见参数量要大于1,查看内存可知rsp+8为第一个参数,rsp+c为第二个参数,因此39行可知第一个参数要小于7,50行可知接下来类似于一个switch语句,跳转量由第一个参数决定。执行命令print /x *0x402470可以得到起始跳转地址为0x400f7c,经过比对发现无论第一个参数取何值只有第一个地址能跳转到,所以第一个参数为0.接下来看第123行,可知第二个参数即0xcf

  • 相关阅读:
    C#-Linq-SelectMany
    C#-Linq-SelectMany
    DI是实现面向切面和面向抽象的前提
    java流程控制之Scanner(2)
    java流程控制之Scanner(1)
    java运算符之三目运算符
    java运算符之位运算
    java运算符之与或非
    java运算符之加减乘除
    java基础语法
  • 原文地址:https://www.cnblogs.com/PanYuDi/p/14056713.html
Copyright © 2020-2023  润新知