csapp bomb lab phase_4

随着课程的深入,笔者发现实验基本是延续着上课的进程来的,包括之前利用jump table 实现了switch的编译。

这一小节采用的知识点是函数(procedure)与递归(recurison),写到这里,笔者觉得CSAPP课程编排真的挺不错,通过实验来强调知识点,所以说,单单看书必然是事倍功半,因为书势必追求完备性,对初学者而言,很难抓到汇编语言部分的重点,而视频可以稍微集中一下知识点,老师的ppt基本可以断定哪些是主干,哪些是枝叶;但最后还是需要实验来精准定位哪些是核心部分。计算机就应该从实践中来,到实践中去。

好,题外话说到这里。接下来继续bomb lab的第四阶段的破解。

1.确定参数类型与个数

注意到 0x401035处存放的是 <explode_bomb>的地址,即引爆函数,<sscanf@plt>函数的功能是获取参数的个数。从这一小段,我们能够确定参数个数为两个。

紧接着下面阅读,我们能够看出来若第一个读入的参数 大于14,炸弹就会引爆,到这里,我们基本可以确定两个参数均为数字。

2.procedure 的 arguments 存放在三个寄存器中,其依次为 %rdi,%rsi,%rdx。

这里相当于是  “最外重”函数调用接口,调用<func4>函数,我们稍后就能看到<func4>是一个递归函数。

在最外重的层面,func4的参数依次为  “输入第一个参数”,“0”, “14”。

3.我们先不急着陷入这个看起来复杂的递归函数<func4>,,秉承着先问干什么,再问怎么做的原则。我们顺着phase_4继续读。

 

(1)test %eax,%eax是我们熟知的判断%eax是否为0的命令,显然,jne 0x401058直接告诉我们,上一个函数的返回值若非0,炸弹就要爆炸。(%eax保存函数的返回值,这是我们需要熟知的)

 (2)cmpl  $0,0xc(%rsp) 表明的是将输入的第二个参数与0做比较,同样,如果不是0就会爆炸,这里可以说是直接告诉你了,第二个参数必须为0.

  同时,我们也了解到了内存堆栈的结构,对于gcc而言,堆栈首指针不喜欢直接生成在刚刚好的位置,而喜欢空置8个byte(两个 int 大小的空间)

好,到目前为止,目标相当清晰了,我们就是要让<func4>函数的返回值为0,这样就大功告成了。

4.procedure 部分

 

通读全篇,我们能看到两个call func4指令,表明此为递归函数。

我们先看递归函数的第一部分代码,这一段代码没有跳转指令,是进入此函数必须运行的部分。

其实这一段就干了一件事

用c语言来写是这个意思:

int ecx =  (edx-esi)//2 +esi;

其中shr $0x1f,%ecx,对于数字较小的情况,相当于对ecx直接赋0了。

将这段汇编代码用c语言描述就是上述的意思

当然最外部的函数接口为 

func4(输入的参数1,0,14);

结合上文,我们现在就是要观察这个函数的输出是否为0。找到对应的参数1就可以破解密码。

我们尝试输入 f(0,0,14)即第一个参数为0的情况

我们会发现

f (0,0,14) = 2* f(0,0,6)=2*2*f(0,0,2)=2*2*2*f(0,0,0)=2*2*2*0=2*2*0=2*0=0

(我在上述的连等式中表达了递归函数的真实运作过程)

写在文末,我们来观察一下函数的最终实验情况。

OK~DONE~

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值