dotaSven 发表于 2015-11-12 10:36

ESP法的原理

在学习中的个人心得,有不对的请指正啊= =

esp法其实是基于堆栈平衡原理,因为加壳后的程序要正确运行,就必须在接近原始入口点处还原现场环境,以保证程序运行与无壳时相同。

由于栈是与cpu相关的,所以不同的系统环境下,栈的地址是不同的,所以不用关注到底要用哪个地址。

要使用esp法(其实我更喜欢叫堆栈平衡法),要注意的不是esp的值,而是要注意壳的入口处的现场环境(栈和各个寄存器值),
一般而言入口处的栈顶是一个kernel32.dll中的地址,在OD中栈区显示 “返回到kernel32.XXXXXXXX”,假设这时候看到对应的栈地
址为0012FFC4。那么你要关注的其实是什么时候栈顶会还原成0012FFC4,而且会恢复入口时各个寄存器的值。

通常用pushad/popad、pushfd/popfd指令来保存与恢复现场环境,或者用若干条push指令来保存某几个关键寄存器的值,所以只要找到壳入口
后的第一个push/pushad/pushfd,执行后发现栈区变成了:

0012FFC0XXXXXXXX
0012FFC47XXXXXXX   返回到kernel32.XXXXXXXX

就可以用命令 hr0012FFC0 ,对0012FFC0 下硬件断点,然后F9,当程序访问到0012FFC0时就会断下,如果这个程序是可以用esp法直接寻找到
OEP的话,这时候就离跳转到OEP的地方不远了。当然单纯使用esp法局限性很大,但是这个原理可以帮助你确定某个片段是不是OEP,从而结合其
他方法找到OEP

本来想做个例子的但是发现截图上传不了。。提示不能上传零字节文件- - 等我弄清楚怎么上传后再传吧



scqandcy 发表于 2015-11-12 14:37

这个东西真是好,一直只知道esp定律,确实不太懂原理

tangdragon 发表于 2015-11-14 10:22

言之有理,上传图很简单吧。不行清一下浏览器缓存和cookie。

whdfog 发表于 2015-11-14 14:44

好,不过怎没没有图

wshxining 发表于 2015-11-14 15:10

授人以鱼,不如授人以渔!知其然,更要知其所以然,多谢楼主分享原理。
页: [1]
查看完整版本: ESP法的原理