CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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”

技术分享

以上是关于CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用的主要内容,如果未能解决你的问题,请参考以下文章

CSAPP 3e: Bomb lab (phase_6)

CSAPP 3e: Bomb lab (secret_phase)

CSAPP 3e: Bomb lab (phase_4)

CSAPP 3e: Bomb lab (phase_1)

CSAPP:BOMB LAB

CSAPP:BOMB LAB