在使用中不能使用EBPESP定律

点评:有很多寄存器在登记尽管其功能和使用上没有区别,但在长期的使用和编程,程序员习惯于登记每个被赋予特殊的意义,例如有默认:EAX用于返回值,ECX计数等。在Win32环境,EBP登记易于与ESP存储调用入口值后退出。






有很多的寄存器在登记尽管其功能和使用上没有区别,但在长期的使用和编程,程序员习惯于登记每个被赋予特殊的意义,例如有默认:EAX用于返回值,ECX是用来计数等。在Win32环境下,使用EBP和ESP登记存储调用方便的ESP值返回退出时加入后的价值,实现栈的平衡目标。



应用前面说过的段落:



原程序的OEP通常开始的两句话,Push EBP和mov ebp,尤其不需要提到它,你知道这两个句子的意思而不是ESP EBP作为指针访问栈。



为什么会这样为什么几乎每个节目都是开始的因为如果我们编写了C函数,应该清楚的是程序的开始是基于一个main函数(main)来启动的,最重要的是在访问堆栈过程中的功能是确保在Win32环境中保持平衡的方式是这样的平衡:



1。让EBP保存ESP的值;



2。在通话结束时





MOV EBP ESP,

pop ebp

Retn





或是它





离开

Retn







两个形式是一个意思。

这样做的好处是,我们不需要考虑多少ESP等于多少次推已成为流行,因为我们知道EBP是放置在ESP值开始。



2。ESP的泛化规律



当寻找OEP,经常断HW esp-4是不成功的,除了外壳代码将删除硬件断点,可能是因为在运行代码时,他的壳OEP ESP不再在EP当ESP(12ffc4),所以我们的公开课是不成功的。



那么如何寻找叠加的价值当壳达到OEP是关键。



我们在这里应用的关键是



Push EBP

MOV EBP的关键,尤其是这句话----



让我解释一下,当程序到达OEP,Push EBP esp-4 ESP的值,然后esp-4分配给EBP和EBP的值为登记在顶层程序功能的ESP值不会改变。尽管他可能进入亚称,它将暂时改变(为子程序的堆栈平衡),但退出后,它会恢复原来的EBP的值根据* pop ebp。



把这句话作为切入点,也就是说,只要我们能打破前的程序,我们可以观察ESP EBP JMP到OEP值时。



三.实战



让我们看看pespin1.1壳一看。在pespin1.0壳,我们可以很容易地通过使用硬件12ffc0找到被盗代码的地方,但当我们去pespin1.1,我们不能做that.hw 12ffc0不能打破所有的。



现在我们使用这个广义ESP定律将程序加载到最后一个异常。



0040ed85 2bdb子ebx,EBX / /停在这里

0040ed87 64:8f03流行DWORD PTR FS:{续}

0040ed8a EAX 58流行

0040ed8b 5d pop ebp

0040ed8c 2bff子EDI,EDI

0040ed8e EB 01 pespin1_ 0040ed91 JMP短。

0040ed90 c466 81 LES ESP,Fword PTR DS:{ esi-7f }



我使用的内存断点的方法来FOEP



004010d3 0000添加BYTE PTR DS:{中},Al

004010d5 0000添加BYTE PTR DS:{中},Al

004010d7 0000添加BYTE PTR DS:{中},Al

004010d9 0000添加BYTE PTR DS:{中},Al

004010db 0000添加BYTE PTR DS:{中},Al

004010dd 0000添加BYTE PTR DS:{中},Al

004010df 75磅短pespin1_ JNZ。004010fc / / FOEP是这里

004010e1 56推ESI

004010e2 ff15 99f44000叫DWORD PTR DS:{ 40f499 }

004010e8 8bf0 MOV EAX ESI,

004010ea 8a00 MOV AL,BYTE PTR DS:{中}



好了,这是程序的顶部,看看寄存器。



EAX 00141e22

0040c708 pespin1_ 0040c708 ECX。

EDX 0040c708 pespin1_。0040c708

0040c708 pespin1_ 0040c708 EBX。

ESP 0012f978

EBP 0012f9c0 / /注意这里

ESI 00141ee0

0040e5cd pespin1_ 0040e5cd EDI。

004010df pespin1_ 004010df EIP。



看,EBP = 0012f9c0,让我们想象一下这个值了。



首先,它必须通过MOV EBP,ESP,也就是说,尤其是0012f9c0此时也在顶推EBP,ESP应该到达OEP当它到达OEP。嗯,这个结论,我们可以很快找到地方偷来的代码位于。



在最后一个例外处停下来



0040ed85 2bdb子ebx,EBX / /停在这里

0040ed87 64:8f03流行DWORD PTR FS:{续}

0040ed8a EAX 58流行

0040ed8b 5d pop ebp

0040ed8c 2bff子EDI,EDI

0040ed8e EB 01 pespin1_ 0040ed91 JMP短。

0040ed90 c466 81 LES ESP,Fword PTR DS:{ esi-7f }



然后将硬件0012f9c0,F9运行,来这里



61 0040d8fb POPAD

55 0040d8fc push ebp

0040d8fd EB 01 JMP短pespin1_。0040d900 / /停在这里

0040d8ff 318b eceb01ac异或DWORD PTR DS:{ EBX ac01ebec },ECX

0040d905 83ec 44个子ESP,44

0040d908 EB 01 pespin1_ 0040d90b JMP短。

7256 pespin1_ 0040d962 0040d90a JB短。

0040d90c EB 01 pespin1_ 0040d90f JMP短。

95 0040d90e xchg eax,EBP

0040d90f ff15 6cf34000叫DWORD PTR DS:{ 40f36c }

0040d915 EB 01 pespin1_ 0040d918 JMP短。



所以很快就发现被盗密码在哪里。



4。总结



上述方法可能总结如下步骤:



(1)。直接或间接地,在程序的顶部。



(2)。得到的顶级程序EBP的值。



(3)。使用两个固定报表的计划找到壳JMP堆栈值OEP初始化。这种方法有很多局限性,因为只有VC和Delphi程序使用初始化开始。



但是有很多方法可以找到top程序。除了内存断点,例如,VC,使用BP过程也是一个很好的断点,可直接得到EBP的值。



5。话



原来的方法有很强的前提条件,这不是一个非常普遍的方法。我不想独自抚养,但jney2兄弟反ESP定律,这个解决方案是一个解决方案。



当然,还有更多的方法。这里我只想说,很多东西都有矛和盾。不可能没有漏洞。我只希望这篇文章能给你一个广阔的思路,在营造一块砖和吸引玉方面发挥作用。