滴水逆向联盟

标题: 堆栈寄存器 ebp esp 精解 [打印本页]

作者: 大禹治水    时间: 2014-10-17 12:10
标题: 堆栈寄存器 ebp esp 精解

最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下。

ebp--栈底指针

esp--栈顶指针



如图所示,简化后的代码调用过程如下:

void Layer02()
{
       int b = 2;
}

void Layer01()
{
       int a = 1;
       Layer02();

}


那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码:

void Layer02()
{
00413700 push        ebp
00413701 mov         ebp,esp
00413703 sub         esp,0CCh
00413709 push        ebx
0041370A push        esi
0041370B push        edi
0041370C lea         edi,[ebp-0CCh]
00413712 mov         ecx,33h
00413717 mov         eax,0CCCCCCCCh
0041371C rep stos    dword ptr es:[edi]
       int b = 2;
0041371E mov         dword ptr ,2
}
00413725 pop         edi
00413726 pop         esi
00413727 pop         ebx
00413728 mov         esp,ebp
0041372A pop         ebp

0041372B ret

我们看到函数调用开始执行如下的两行代码:

00413700 push        ebp
00413701 mov         ebp,esp

返回前执行如下代码:

00413728 mov         esp,ebp
0041372A pop         ebp

0041372B ret

那么这几行代码到底是什么意思呢?首先,如图上所示:

开始两行代码的意思是先将ebp1压栈,然后将现在的栈顶esp1作为函数调用时的栈底,所以会执行如下语句:

00413701 mov         ebp,esp

那么,返回前的几条语句又是什么意思呢?

我想大家已经猜到了,当函数调用执行结束,我们要执行相反的过程:

00413728 mov         esp,ebp

还原栈顶指针


0041372A pop         ebp

还原栈底指针


0041372B ret

返回到函数调用前的指令继续执行。待续…



作者: OneTime    时间: 2014-11-7 21:09
哎哟,讲的不错哟!
作者: 树袋老妖    时间: 2015-1-22 09:50
学习了,楼主V5




欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2