计算机系统原理 Bomb实验 炸弹二/phase_2

Bomb 日志

实验准备:

经过第一关炸弹的拆除,我们已经对程序执行时栈帧结构操作有了一部分了解,所以接下来我们只需要依照第一关炸弹的拆除办法依次对后面几关的代码进行反汇编、反汇编分析找出关键字符串即可

具体过程:

通过vi指令打开反汇编得到bomb.s文件:

 

查看bomb.s文件:

 

找到关卡2的反汇编代码:

 

分析此段代码:

push   %ebp              ebp寄存器中的内容入栈  
mov    %esp,%ebp         esp中的内容复制到ebp中
push   %esi              esi寄存器中的内容入栈  
push   %ebx              ebx寄存器中的内容入栈  
sub    $0x30,%esp        分配16进制30即48个字节的空间
lea    -0x20(%ebp),%eax  取出ebp-32处的值传送到eax中  
mov    %eax,0x4(%esp)    eax中的值存入esp+4位置处   
mov    0x8(%ebp),%eax    ebp+8位置处的数据传输到eax中
mov    %eax,(%esp)       eax中的值传输到esp中     
call   804910b <read_six_numbers>   

过程调用804910b为被调用过程起始点指令地址将返回地址入栈,并跳转到被调用过程的起始处


cmpl   $OxO,-0x20(%ebp)  数值0ebp-32处的值相减
jne    8048d90 <phase_2+0x26>

根据上一步想减的结果进行下一步,如果不等于0,执行jne指令跳转到8048d90
cmpl   $0x1,-0x1c(%ebp)  数值1ebp-28处的值相减
je     8048d95 <phase_2+0x2b>

根据上一步减的结果进行下一步,如果相等,执行je指令跳转到8048d95
call   80490d1  <explode_bomb>  跳转到80490d1通过函数引爆炸弹


lea    -0x18(%ebp),%ebx         取出ebp-24处的值传送到ebx中 
lea    -0x8(%ebp),%esi          取出ebp-8处的值传送到esi  
mov    -0x4(%ebx),%eax        ebx-4ebp-24-4处的数据传输到eax中
add    -Ox8(%ebx),%eax        ebx-8即ebp-24-8处的数eax中数相加
cmp    %eax,(%ebx)            eax寄存器里的值与ebx寄存器值相减
je     8048daa <phase_2+0x40>

根据上一步减的结果进行下一步,如果相等,执行je指令跳转到8048daa  
call   80490d1 <explode_bomb>          跳转到80490d1通过函数引爆炸弹


add    $Ox4,%ebx      ebx+4即ebp-24+4处中的值相加,结果传回ebx中
cmp    %esi,%ebx      esi寄存器里的值与ebx寄存器值相减
jne    8048d9b <phase_2+0x31>

根据上一步想减的结果进行下一步,如果不相等,执行jne指令跳转到8048d9b
add    $Ox30,%esp     将位置48处的值与esp中的值相加,结果传回ebx中
pop    %ebx           ebx从栈中弹出
pop    %esi           esi从栈中弹出
pop    %ebp           ebp从栈中弹出
ret                   结束程序

本题的栈帧结构如下图所示:


拆除炸弹即不让第段程序进入爆炸。分析代码,程序先将寄存器esi、ebx进行压栈保存,再给整个进程分配3*16即48个字节,所有的准备工作完成。首先,将ebp-2*16处的值传输到eax中,再将eax中的值存入esp+4即edp-32处;将ebp+8中的值传输到eax中,再将eax中的值存入esp处;cmpl指令使0与ebp-2*16处的值相减,根据检查的结果判断下一步的走向,如果上一步相减的结果不为0,就跳到8048d90处即执行炸弹程序,触发炸弹,所以数字串的第一个数字为0;第二个cmpl指令使1与ebp-(16+12)中的值相减,再根据相减结果判断下一步走向,如果结果为0,则跳到8048d95继续执行,就跳过了炸弹。lea将ebp-(16+8)的值存入ebx中,第二个lea将ebp-8的值存入esi中,后面会用到这里的赋值控制循环,再将ebx-4即ebp-24-4的值存入eax中,将ebx-8即ebp-24-8的值与eax中的值相加存入eax中,最后比较eax和ebx中的值,如果相等,跳到add指令行,否则执行call炸弹,触发炸弹。add指令将ebx中的值加上4,最后比较esi与ebx中的值,如果相减不等于0,则进入下一循环,否则循环结束,整个程序结束,综上所述:只要在每一次碰到炸弹时不去触发它,就可以保证程序正常执行,即解除炸弹危机了。

所以易知:

关炸弹可使用数字“011235”来进行拆除。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值