深入理解操作系统实验——bomb lab(作弊方法2)

2、作弊方法2:
上面的作弊方法可以看到,没有密码的思路是可以的,但还是对数据的输入个数有要求,而且对于每个炸弹都要修改太过繁琐,那么接下来就是对这一点进行优化。可以想到如果我们把炸弹进行修改,相当于弄一个“哑弹”,那么不管密码对不对,都不会引爆炸弹,这样就可以想到对explode_bomb进行修改,源代码为:
深入理解操作系统实验——bomb lab(作弊方法2)
可以将从179~198全部进行修改,全部改为0,最终改为:
深入理解操作系统实验——bomb lab(作弊方法2)
基本上将所有的全部去掉,整个explode_bomb已经成了一个哑弹。
但是发现第六个炸弹还不行,查找后发现第六个炸弹有很多的跳转指令,如果输入不满足可能会导致死循环或者段错误,所以要单独对第六个炸弹进行修改。
首先思考一下为什么会发生段错误,经过观察后发现第六个炸弹不仅仅和引爆函数有关系,其本身的跳转就很复杂,这里实际上也是在变相的提醒我们在写代码的时候不要滥用goto指令,否则会导致函数的逻辑十分的复杂。
段错误的发生主要有两种,要么是陷入了死循环,要么是访问了超过esp范围的数据导致缓冲区溢出。所以需要对第六个炸弹进行修改,比方说将几个跳转指令修改为EB,jmp无条件跳转,并通过公式(目的地址-当前地址-2)得到需要的系数。
但还要考虑第六个炸弹的一些附加功能,比方说对计数区域的累加操作,或者计数操作。
最终得到第六个炸弹的代码如下:
深入理解操作系统实验——bomb lab(作弊方法2)
然后再对phase_defused中进入秘密炸弹的路径进行修改,在进入秘密炸弹的时候先会判断是否输入三个以上的数据,然后再判断第三个数据是不是DrEvil字符串,所以只需要修改这两个点就可以了,最终得到的是:
深入理解操作系统实验——bomb lab(作弊方法2)
最终的结果是:
深入理解操作系统实验——bomb lab(作弊方法2)
这样就可以破除了输入个数的限制和秘密炸弹进入的限制。不管我输入什么(只要不是太过分,比方说输入超过了计算机本身的界限,或者输入非字符数据),也不管我输入多少个(在计算机的处理能力之内),都可以通过炸弹函数。说真的,我个人认为,这才叫**,拆炸弹。