导航
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.之后又进行跳转。