在使用中不能使用EBPESP定律

在使用中不能使用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定律,这个解决方案是一个解决方案。
当然,还有更多的方法。这里我只想说,很多东西都有矛和盾。不可能没有漏洞。我只希望这篇文章能给你一个广阔的思路,在营造一块砖和吸引玉方面发挥作用
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部