<csapp> bomb lab (《深入理解计算机系统》lab2)

bomblab下载页:http://download.csdn.net/download/u013648407/7279933  其中bomb是可执行文件  需要用objdump指令反汇编,c1.txt是我反汇编所得到的assembly code。

*****************************************************************************************************************************************************************************************

the second lab,bomb lab。

在我看来这个lab难度比较大。需要花不少时间和精力才能完成。对于这个lab,不同的人有不同的看法,有的人觉得通过阅读assembly code 来提高纯粹的阅读代码能力更重要,有的人觉得合理运用gdb获得更大效率更重要,仁者见仁吧。但不得不说这个lab是很有趣的一个lab,拆除炸弹那一瞬间的快感是无法用言语形容的。想要尝试的朋友可以自行下载,良心0积分。

废话不说,开始:

*****************************************************************************************************************************************************************************************

Q1:

080490b9 <phase_1>:
 80490b9: 55                            push   %ebp
 80490ba: 89 e5                        mov    %esp,%ebp
 80490bc: 83 ec 18                     sub    $0x18,%esp
 80490bf: c7 44 24 04 ec 9d 04 movl   $0x8049dec,0x4(%esp)<-将内存0x8049dec中的内容压栈
 80490c6: 08 
 80490c7: 8b 45 08                     mov    0x8(%ebp),%eax
 80490ca: 89 04 24                     mov    %eax,(%esp)<-将输入的内容压栈
 80490cd: e8 3d 00 00 00       call   804910f <strings_not_equal> <-调用这个函数,看名字知道是判断字符串相等与否的
 80490d2: 85 c0                        test   %eax,%eax<-判断返回值,返回值是1则跳到bomb,说明要求上面两个压栈的字符串必须相等
 80490d4: 74 05                        je     80490db <phase_1+0x22>
 80490d6: e8 44 07 00 00       call   804981f <explode_bomb>
 80490db: c9                                   leave  
 80490dc: 8d 74 26 00                  lea    0x0(%esi,%eiz,1),%esi
 80490e0: c3                                   ret    
 80490e1: 90                                   nop


分析如上,解决方法就是用gbd查看0x8049dec中的字符串,再将该字符串作为密码输入即可。指令为x/s 0x8049dec

*****************************************************************************************************************************************************************************************

Q2:

080490b9 <phase_1>:
 80490b9: 55                            push   %ebp
 80490ba: 89 e5                        mov    %esp,%ebp
 80490bc: 83 ec 18                     sub    $0x18,%esp
 80490bf: c7 44 24 04 ec 9d 04 movl   $0x8049dec,0x4(%esp)<-将内存0x8049dec中的内容压栈
 80490c6: 08 
 80490c7: 8b 45 08                     mov    0x8(%ebp),%eax
 80490ca: 89 04 24                     mov    %eax,(%esp)<-将输入的内容压栈
 80490cd: e8 3d 00 00 00       call   804910f <strings_not_equal> <-调用这个函数,看名字知道是判断字符串相等与否的
 80490d2: 85 c0                        test   %eax,%eax<-判断返回值,返回值是1则跳到bomb,说明要求上面两个压栈的字符串必须相等
 80490d4: 74 05                        je     80490db <phase_1+0x22>
 80490d6: e8 44 07 00 00       call   804981f <explode_bomb>
 80490db: c9                                   leave  
 80490dc: 8d 74 26 00                  lea    0x0(%esi,%eiz,1),%esi
 80490e0: c3                                   ret    
 80490e1: 90                                   nop


通过对主要部分的分析,看出这个密码是一个数列,首项为1,a[n]=n*a[n-1].

答案即是1 2 6 24 120 720

*****************************************************************************************************************************************************************************************

08048eb1 <phase_3>:
 8048eb1: 55                   push   %ebp
 8048eb2: 89 e5                mov    %esp,%ebp
 8048eb4: 53                   push   %ebx
 8048eb5: 83 ec 34             sub    $0x34,%esp
 8048eb8: 8d 45 f0             lea    -0x10(%ebp),%eax<-第三个输入存储在-0x10(%ebp)
 8048ebb: 89 44 24 10          mov    %eax,0x10(%esp)
 8048ebf: 8d 45 ef             lea    -0x11(%ebp),%eax<-第二个输入存储在-0x11(%ebp)
 8048ec2: 89 44 24 0c          mov    %eax,0xc(%esp)
 8048ec6: 8d 45 f4             lea    -0xc(%ebp),%eax<-第一个输入存储在-0xc(%ebp)
 8048ec9: 89 44 24 08          mov    %eax,0x8(%esp)
 8048ecd: c7 44 24 04 2e 9e 04 movl   $0x8049e2e,0x4(%esp)<-此处使用gdb设置断点调试得到0x8049e2e中存储的是一个“%d,%c,%d”,即输入的格式
 8048ed4: 08 
 8048ed5: 8b 45 08             mov    0x8(%ebp),%eax
 8048ed8: 89 04 24             mov    %eax,(%esp)
 8048edb: e8 48 fb ff ff       call   8048a28 <sscanf@plt>
 8048ee0: 83 f8 02             cmp    $0x2,%eax<-输入数据个数必须大于2,否则爆炸
 8048ee3: 7f 05                jg     8048eea <phase_3+0x39>
 8048ee5: e8 35 09 00 00       call   804981f <explode_bomb>
 8048eea: 83 7d f4 07          cmpl   $0x7,-0xc(%ebp)
 8048eee: 66 90                xchg   %ax,%ax
 8048ef0: 0f 87 34 01 00 00    ja     804902a <phase_3+0x179><-以上三行比较输入的第一个数字与7,若第一个输入大于7则爆炸(804802a直接相当于跳转到爆炸函数)
 8048ef6: 8b 5d f4             mov    -0xc(%ebp),%eb
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值