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
本来想做个例子的但是发现截图上传不了。。提示不能上传零字节文件- - 等我弄清楚怎么上传后再传吧
这个东西真是好,一直只知道esp定律,确实不太懂原理 言之有理,上传图很简单吧。不行清一下浏览器缓存和cookie。 好,不过怎没没有图 授人以鱼,不如授人以渔!知其然,更要知其所以然,多谢楼主分享原理。
页:
[1]