隐藏关卡。Secretphase
这个隐藏关卡还是很难发现的,自己带的班上的学生中,仅有3个学生发现并解除了炸弹。中间也出现了一些小小问题,在给他们验收的时候也有意识的去引导他们发现一些小问题,并讨论解决。
首先是隐藏关卡的发现,其实在汇编代码中就有一个secret_phase.就是看怎么跳到隐藏关卡了,搜索发现,是通过phase_defused作为入口点的。其实这里可以不分析这个函数,看到在main函数中没通关一关就会调用这个函数,可以在这个函数中设置断点,可以直接利用jump跳到隐藏关卡去做。后面分析这个函数也会发现为什么每次通过一关它会调用,大概是用来比较一下你是否已经全部通关吧。
接下来是常规的进入隐藏关卡:
Phase_defused的汇编代码分析一下:
这里是首先判断一下是否已经通过了六个关卡。
接下来是sscanf函数的调用,在这里有三个ebp的偏移,按照以前通关的经验分析,应该是要输入三个东西,输入的格式规定在立即数0x804a200中查看,另外调用之后的返回值可以发现确实如果输入的小于3就不会进入隐藏关卡。关于sscanf函数一直猜测它的返回值就是输入的个数,没有具体进入去看,但是中间在某一关中输入了123456这6个数,查看了返回值eax居然是2,但是在这里却可以返回大于3的数,所以这个函数也是很有意思的,不像我们猜测的那么简单,但是并不影响我们解除炸弹,我们分析这个sscanf函数应该是根据不同的情况返回不同范围的值,不是具体个数的值,有兴趣的朋友可以自己深入研究一下。
通过gdb调试看看立即数里面的输入的格式,首先先在phasedefused函数中的0x804959处设置断点,是要将全部六个关卡都通过后,跳到断点处。