姑且称之为“陷阱”吧,如下,直接上代码:
最近在做Flare-7 的break这道题,算是对linux下没有采用vm保护技术的crackme的一种挑战,遇到了下述的代码:
上图红色部分,明显执行时会报错;这是break这个crackme采取的一种机制,sub_0804C369这个进程是有另一个进程attach它的,并接收它的信号,进行相应的处理。上图红色部分会报SIGSEGV信号,查看调试它的进程的代码,如下:
可以看到,V34是栈保存的下一条指令,v33就是第一张图中的&loc_804c3c4,v32保存的是第一张图中的&v5,初始是0。那么调试进程的第二张图的代码的意思就是跳转回loc_804c3c4进行执行,直到第16次碰到MEMORY[0](&loc_804C3C4, &v5),则结束循环。
这就是这个crackme与常规程序不一样的地方之一,
我们要说的F5出的问题在哪呢? 这也是我还太缺乏调试经验,我们可以看到loc_804c3c4这里的汇编代码是这样子的:
而我们之前在第一张图里看到的F5自动逆向过来的伪代码是chmod(a4,back)。
所以说,这里F5插件有一些指令没有做逆向,或者他可能认为无用忽略了吧:)害的我这逆向新入门的新手,对着F5代码写了个计算这个crackme的password中间部分的算法,结果不是希望得到的。
--------------------------------------------------------------------------------------------------------------------------
接着上面的,经过测试,应该是因为这段代码中一开始[ebp+v5]=0,所以后面那些指令计算的结果都是0,F5翻译过来也没有必要。因为F5不会帮我们去自动翻译那个MEMORY[0](&loc_804C3C4, &v5)循环,所以它确实没必要翻译这一段。这也告诉我们,以后如果遇到这种技巧,还是要人工看一下汇编代码,才能做到对机器语言翻译的正确。如下图,
把[ebp+v5]手动改为1,
再按F5看一下,结果就发生变化了
因为F5识别不了这种循环,所以只能翻译成这个样子了。总之,F5是没有问题的。