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 使用的主要内容,如果未能解决你的问题,请参考以下文章