zoukankan      html  css  js  c++  java
  • CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

      这里是第二关,在这里分享一些在解题过程中用到的GDB功能。

      首先,要进行断点,比如,在第二关中,断点操作有:

    81:    input = read_line();
    82:    phase_2(input);
    83:    phase_defused();

      break 81;  break 82;  break 83;  分别在read_line,phase_2,phase_defused,三个函数入口进行了断点。

    另外,还有一个地方需要断点,那就是explode_bomb;操作:break explode_bomb。

      之后可以使用跳转命令直接在运行到断点后跳转到某个函数 或某个地址。在这个lab里我经常用的是jump *0x地址。直接跳转到read_line函数,这样就不用再后边的关卡中非要一关一关地输入,直到正在调试的那一关。为了正确跳转到read_line,我需要知道那一关的read_line函数地址,这个地址可以通过info break(显示断点信息)得到。

      如图,info break得到断点地址后,jump直接跳转到函数入口。 eg:jump *0x400e4e。

      同时,还需要进行单步运行调试,查看寄存器值。用 layout regs 命令可以做到。然后 si , ni ,进行单步执行(si会运行进入被调用函数内,ni不进入调用函数)

      

    然后是查看内存的命令:x/(n/f/u) 0x地址。百度查询多种用法,这就不一一赘述了。

    ************************************************************************************************************************************************

    分割线

    ************************************************************************************************************************************************

    这里贴上phase_2的解题方法,通过注释的形式写出来了。

    0000000000400efc <phase_2>:
      400efc:    55                       push   %rbp
      400efd:    53                       push   %rbx
      400efe:    48 83 ec 28              sub    $0x28,%rsp
      400f02:    48 89 e6                 mov    %rsp,%rsi
      400f05:    e8 52 05 00 00           callq  40145c <read_six_numbers>
      400f0a:    83 3c 24 01              cmpl   $0x1,(%rsp)                    ;如果第一个数(sp)不等于1,bomb.
      400f0e:    74 20                    je     400f30 <phase_2+0x34>
      400f10:    e8 25 05 00 00           callq  40143a <explode_bomb>
      400f15:    eb 19                    jmp    400f30 <phase_2+0x34>
      400f17:    8b 43 fc                 mov    -0x4(%rbx),%eax                
      400f1a:    01 c0                    add    %eax,%eax
      400f1c:    39 03                    cmp    %eax,(%rbx)                    ;如果第一个数的2倍不等于第二个数,bomb.
      400f1e:    74 05                    je     400f25 <phase_2+0x29>        ;eg:1*2 == 2;第二个数为2;
      400f20:    e8 15 05 00 00           callq  40143a <explode_bomb>
      400f29:    48 39 eb                 cmp    %rbp,%rbx                
      400f25:    48 83 c3 04              add    $0x4,%rbx                    ;栈指针+1,向后移位(检查后边的数字)
      400f2c:    75 e9                    jne    400f17 <phase_2+0x1b>        ;如果移位没有到最后一个数字(第六个)
      400f2e:    eb 0c                    jmp    400f3c <phase_2+0x40>        ;循环执行检查.
      400f30:    48 8d 5c 24 04           lea    0x4(%rsp),%rbx                ;%rbx储存第2位数字的起始地址。(数据栈顶)
      400f35:    48 8d 6c 24 18           lea    0x18(%rsp),%rbp                ;%bpx储存最后第6位的结束地主。(数据栈底)
      400f3a:    eb db                    jmp    400f17 <phase_2+0x1b>
      400f3c:    48 83 c4 28              add    $0x28,%rsp
      400f40:    5b                       pop    %rbx            ;按规律得出答案 "1 2 4 8 16 32".
      400f41:    5d                       pop    %rbp
      400f42:    c3                       retq   

    得出第二关的答案“1 2 4 8 16 32”

  • 相关阅读:
    Java 条件语句
    Java循环
    Java 变量
    Java 数据类型
    nginx+php发布网站
    安装MySQL5.7
    docker-compose参数
    部署
    dockerfile编写
    在VMware中安装CentOS7
  • 原文地址:https://www.cnblogs.com/xihuyouyu/p/7522458.html
Copyright © 2011-2022 走看看