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

春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述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(显示断点信息)得到。
CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

文章图片

如图,info break得到断点地址后,jump直接跳转到函数入口。 eg:jump *0x400e4e。
 
同时,还需要进行单步运行调试,查看寄存器值。用 layout regs 命令可以做到。然后 si , ni ,进行单步执行(si会运行进入被调用函数内,ni不进入调用函数)
CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

文章图片


然后是查看内存的命令:x/(n/f/u) 0x地址。百度查询多种用法,这就不一一赘述了。
 
************************************************************************************************************************************************
分割线
************************************************************************************************************************************************
 
这里贴上phase_2的解题方法,通过注释的形式写出来了。
0000000000400efc < phase_2> : 400efc:55push%rbp 400efd:53push%rbx 400efe:48 83 ec 28sub$0x28,%rsp 400f02:48 89 e6mov%rsp,%rsi 400f05:e8 52 05 00 00callq40145c < read_six_numbers> 400f0a:83 3c 24 01cmpl$0x1,(%rsp); 如果第一个数(sp)不等于1,bomb. 400f0e:74 20je400f30 < phase_2+0x34> 400f10:e8 25 05 00 00callq40143a < explode_bomb> 400f15:eb 19jmp400f30 < phase_2+0x34> 400f17:8b 43 fcmov-0x4(%rbx),%eax 400f1a:01 c0add%eax,%eax 400f1c:39 03cmp%eax,(%rbx); 如果第一个数的2倍不等于第二个数,bomb. 400f1e:74 05je400f25 < phase_2+0x29> ; eg:1*2 == 2; 第二个数为2; 400f20:e8 15 05 00 00callq40143a < explode_bomb> 400f29:48 39 ebcmp%rbp,%rbx 400f25:48 83 c3 04add$0x4,%rbx; 栈指针+1,向后移位(检查后边的数字) 400f2c:75 e9jne400f17 < phase_2+0x1b> ; 如果移位没有到最后一个数字(第六个) 400f2e:eb 0cjmp400f3c < phase_2+0x40> ; 循环执行检查. 400f30:48 8d 5c 24 04lea0x4(%rsp),%rbx; %rbx储存第2位数字的起始地址。(数据栈顶) 400f35:48 8d 6c 24 18lea0x18(%rsp),%rbp; %bpx储存最后第6位的结束地主。(数据栈底) 400f3a:eb dbjmp400f17 < phase_2+0x1b> 400f3c:48 83 c4 28add$0x28,%rsp 400f40:5bpop%rbx; 按规律得出答案 "1 2 4 8 16 32". 400f41:5dpop%rbp 400f42:c3retq

 
得出第二关的答案“1 2 4 8 16 32”
【CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用】
CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

文章图片


    推荐阅读