姑且称之为“陷阱”吧,如下,直接上代码:
最近在做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是没有问题的。
本文讲述了在破解Flare-7的Crackme过程中,作者发现F5插件未能正确逆向loc_804c3c4处的内存循环技巧,导致错误的算法实现。通过手动分析汇编代码,揭示了F5对特定代码段的翻译缺陷,并强调了在面对复杂代码时人工检查的重要性。
1万+

被折叠的 条评论
为什么被折叠?



