BombLab Phase-3 & Phase-4 &Phase-5

本文详细分析了BombLab的Phase_3、Phase_4和Phase_5。Phase_3中,输入的两个正整数需满足特定条件才能避免炸弹爆炸;Phase_4的解同样依赖于func4函数的返回值;Phase_5要求输入的第二个数经过循环运算后与第一个数相等。通过对汇编代码的解析,找到了各个阶段的解。
摘要由CSDN通过智能技术生成

导航

 

BombLab Phase-1 & Phase-2

BombLab phase-6 & secret_phase

Phase_3

关于风格改变:因为一段段分析代码可以逻辑清晰有序一点,那么就摒弃了以前先上汇编代码再画栈帧图的方式,我们直接给出函数调用的所有栈帧,这样读者有个大概印象后再看后面的汇编代码会逻辑清晰一点。

  • Phase_3栈帧图

 

  • Scanf栈帧

因为scanf函数是动态链接库的函数,比较特殊,不方便直接查看反汇编,但我们可以画出它的栈帧图如下:

 

 反汇编phase_3函数

1.

开栈

首先,是标准的ebp进栈和栈扩张操作,我们看到栈扩张了40个字节。

之后我们可以看到这段代码将 ebp-0x10 、ebp-0xc 、 0x804a23e 、ebp+8(也就是输入字符串的地址) 依此放在了 esp+0xc、esp+0x8、esp+0x4、esp的位置,把这些值都放在esp上面的位置,我们可以猜想这肯定是为了调用scanf函数用的。

那么0x804a23e是什么?放在scanf上什么作用呢?我们查看下内存:

第一个参数是我们传入的是我们的输入,第二个是“%d %d”,说明我们输入的是两个正整数,存放在了ebp-0x10 、ebp-0xc这两个位置。

 

2.

scanf函数调用返回结果

Scanf函数返回的结果保存在eax中,至于scanf函数返回的结果到底是什么我们之后再谈。现在我们知道返回结果 eax>1 炸弹才不会爆炸。

 

3.

这边说明输入的第一个值一定要<=7,否则就爆炸。

 

4.

我们可以看到这个跳转语句是根据eax的取值进行跳转。而eax里存放的是ebp+0xc地址的值,也就是我们输入的第一个数。那么当我们输入不同的数它将跳转到不同的位置开始。而我们输入的数只可能是 0 1 2 3 4 5 6 7。那么我们依此看看这几个数对应地址存放了什么东西:

我们可以看到是7个地址,而且七个跳转地址分别也可以在程序中找到。

那假设我们输入的是0,那么我们将跳转到0x8048f12的位置。我们从这个位置继续往下运算。

 

5.

我们发现eax赋值完毕后,又进行了跳转。

之后又进行了一些列的加减运算:

Eax=0x314-0x35a+0x2ef-0x216+0x216-0x216+0x216-0x216=147

最后eax中的值为147.之后又进行跳转。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值