好友
阅读权限10
听众
最后登录1970-1-1
|
在学习中的个人心得,有不对的请指正啊= =
esp法其实是基于堆栈平衡原理,因为加壳后的程序要正确运行,就必须在接近原始入口点处还原现场环境,以保证程序运行与无壳时相同。
由于栈是与cpu相关的,所以不同的系统环境下,栈的地址是不同的,所以不用关注到底要用哪个地址。
要使用esp法(其实我更喜欢叫堆栈平衡法),要注意的不是esp的值,而是要注意壳的入口处的现场环境(栈和各个寄存器值),
一般而言入口处的栈顶是一个kernel32.dll中的地址,在OD中栈区显示 “返回到kernel32.XXXXXXXX”,假设这时候看到对应的栈地
址为0012FFC4。那么你要关注的其实是什么时候栈顶会还原成0012FFC4,而且会恢复入口时各个寄存器的值。
通常用pushad/popad、pushfd/popfd指令来保存与恢复现场环境,或者用若干条push指令来保存某几个关键寄存器的值,所以只要找到壳入口
后的第一个push/pushad/pushfd,执行后发现栈区变成了:
0012FFC0 XXXXXXXX
0012FFC4 7XXXXXXX 返回到kernel32.XXXXXXXX
就可以用命令 hr 0012FFC0 ,对0012FFC0 下硬件断点,然后F9,当程序访问到0012FFC0时就会断下,如果这个程序是可以用esp法直接寻找到
OEP的话,这时候就离跳转到OEP的地方不远了。当然单纯使用esp法局限性很大,但是这个原理可以帮助你确定某个片段是不是OEP,从而结合其
他方法找到OEP
本来想做个例子的但是发现截图上传不了。。提示不能上传零字节文件- - 等我弄清楚怎么上传后再传吧
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|