标题:我对esp定律脱壳的理解
-------------------------------------------------------------------------------------------------------------------------------
时间:2006/8/25 17:40:29
-------------------------------------------------------------------------------------------------------------------------------
内容:
什么是esp?
他是堆栈指针寄存器(stack pointer)
什么是堆栈?
就是把数据象堆砖头一样 一块堆在一块上面 所以取砖头时候就只能取最后存放的最上面那一块 而存放砖头就只能存放在最上面那块 也就是别人所说的 后进先出(最后放上去的砖头 最先 取出来)这种数据结构就上堆栈
什么是寄存器
他是cpu里面固定的几个内存单元但比普通内存条上内存单元要快很多 cpu直接对寄存器进行超做
我们可以把内存器看成 c语言里 系统定义的几个变量 数据啊 字符串都存放在里面
什么是call
说简单就是调用一个子程序 比如 call一个密码验证
比如
00040414 mov ax [00045847]
00040418 mov bx .....
00040420 call 0042587
00040422 .....
在程序执行call之前 他需要保存call命令下面的主程序的地址 00040422 把他保存在哪呢 因为等下还要用到他 而且他是最后保存的 但一执行完call后就要调用00040422这个地址 所以保存在堆栈里最好了 后进先出的特点
无论在call里面使用了多少次 入栈 出栈最后call调用完后00040422这个数据出栈拉 开始执行了00040422这里的命令
堆栈指针会 再次 指向 00040422下面那个数据
所以堆栈指针的位置在调用前后没有发生改变
这就是有名的堆栈平衡(堆栈指针在执行一系列程序后指向位置不变)
而压缩壳代码就可以看成这一些程序 这些程序就是调用一些子程序 把代码压缩 调用完后就返回到
原来调用前的状态 所以呢 只要知道壳入口的esp 那么壳程序结束后
必然esp再次恢复到原来的数值
所以我门下短点就以 壳入口前的那个esp数值为依据
当esp数值再次变为原来数值前 那么就是壳程序完成的时候