一.首先先阅读CSAPP官网上的两份文件(gdb使用说明与handout)
准备工作:切换terminal到bomb的文件夹下,
可以通过ls指令查看文件
关键就在于可执行文件bomb(绿色的那个)
二.对于phase_1拆炸弹:
1.打开关键道具 gdb (GNU DeBuger)对可执行文件逐步分析
2.(可以先用objdump -t)查看该文件的汇编代码,不过阅读过两份官方文件应该明白,此问题在于
输入六次密码,密码都正确就算解除炸弹。
3.直接进入正题:
(1)打开gdb
(2)在gdb下打开bomb可执行文件 输入
file bomb
(3)查看phase_1部分的汇编代码(disas phase_1)
(4)分析:
在第一个阶段的函数中,最令人关注的是<explode_bomb>这个函数的调用,而调用的条件,正是test %eax,%eax。而这个指令就是简单的与指令(可百度),当且仅当%eax的值为0时,才可以避免炸弹的爆炸。所以%eax在上一个函数(判断字符串是否相等)确定的值很关键,而%eax本身就是存放函数return值的寄存器。所以关注点重心在”字符串是否相等函数”上。
先不必打开函数体去思考,我们先考虑函数的接口,函数的实参放在%rdi和%rsi里面,这一点是可以确定的,而此函数又势必要用到参数,所以我们只需要弄清楚传入该函数的参数即可-->%rdi与%rsi
(5)操作
先设置一个断点,我们再运行此程序,不然程序在你输入后就直接爆炸了。
(b 的意思就是 breakpoint的缩写,phase_1是第一阶段密码函数的名字)
然后就可以run了
现在程序正好停在phase_1的开头这里,我们可以看一下函数体的代码,然后再做决定
发现上面有一个箭头,这个箭头表明下一步要执行的程序,我们逐步执行,使用的指令是
stepi
再执行一步
此时我们可以看一下%edi与%esi的值了
显然存放的是地址信息,我们猜测字符串存放在这两个地址里面,检查一下
确实如此,由此我们可知第一个phase的正确字符串了。上面两条指令
x/s的意思是 exam string 详细的说明在官方文件里有说明。