当前位置:网站首页 > 黑客培训 > 正文

ESP定律原理详解

freebuffreebuf 2020-03-26 447 0

本文来源:ESP定律原理详解

原创 青空 合天智汇

0x00 前言

疫情期间闲着也是闲着,在逆向某软件时深入了解了下ESP定律,然后就想写个文章记录并分享下。

ESP定律又称堆栈平衡定律,是应用频率最高的脱壳方法之一 ,不论是新手还是老手都经常用到。据我所知,ESP定律是一位外国大牛发现的,但目前已无从考证(未找到相关资料)。

0x01 前置知识


栈(stack)是内存中分配的一段空间。 向一个栈插入新元素又称作入(push)放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素又称作出栈(pop),它把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

v2-97fafe9cb378ef9809dd315379169f24_720w

call

相当于高级语言中的函数调用。 当执行call指令时,进行两步操作: 将下一条的指令的地址压入栈中,再跳转到该地址处。 相当于:

push ip  jmp near ptr 地址

ret ModuleEntryPoint> EDX 004E820D offset r1.ModuleEntryPoint> EBX 0036C000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1.ModuleEntryPoint> EDI 004E820D offset r1.ModuleEntryPoint> EIP 004E820D r1.ModuleEntryPoint>

然后是到OEP时各寄存器的情况

EAX 0072FFCC ECX 004E820D offset r1.ModuleEntryPoint> EDX 004E820D offset r1.ModuleEntryPoint> EBX 0036A000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1.ModuleEntryPoint> EDI 004E820D offset r1.ModuleEntryPoint> EIP 00401500 r1.00401500

我们发现只有EIP和EAX寄存器的数值发生了变化,而EAX保存的是OEP的地址,这是什么原因呢?

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置.

0x04 适用范围

我自己总结了一个比较小白的方法,那就是载入程序后只有esp寄存器内容发生变化,那么这个程序多半可以用ESP定律(如有错误多谢指正)。

几乎全部的压缩壳, 一些早期的加密壳 (这是在网上收集到的资料总结的,经过我自己的实践,基本准确)。

0x05 总结

以上就是我对ESP定律的理解,如有错误,请轻喷 ^-^ ,我也还只一只刚迈入二进制世界的菜鸟,希望我这篇文章对刚入门的小白有所帮助>_

最后再加一句找OEP不是最难的,最难的还是修复。如果对OEP的识别有所疑惑可以问我也可以在网上收集相关资料,还是比较多的。

利用ESP定律进行脱壳

http://www.hetianlab.com/expc.do?ec=ECID4054-1b54-4b49-9aa7-61ed981ca101理解ESP原理的操作机理并掌握使用ESP原理进行脱壳的流程。)

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!


转载请注明来自网盾网络安全培训,本文标题:《ESP定律原理详解》

标签:技术文章网络安全

关于我

欢迎关注微信公众号

关于我们

网络安全培训,黑客培训,渗透培训,ctf,攻防

标签列表