• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

的函数调用离不开堆栈。没有堆栈,就没有函数调用。本节将解释如何在堆栈上调用函数。

栈帧/活动记录

当一个函数被调用时,该函数运行所需的所有信息都将被推入堆栈,这通常被称为堆栈帧或激活记录。活动记录一般包括以下几个方面:

1)函数的返回地址,即函数完成后在哪里继续执行下面的代码。例如:

int a,b,c;

func(1,2);

c=a b;

从C语言来看,func()函数执行后,会继续执行C=a b;语句,那么返回地址就是该语句在内存中的位置。

注意:C语言代码最终会被编译成机器指令。确切的说,返回地址应该是下一条指令的地址。这里之所以是下一条C语言语句的地址,只是为了更直观地说明问题。

2)参数和局部变量。一些编译器,或者打开了优化选项的编译器,会通过寄存器传递参数,而不是将参数推入堆栈。我们暂时不考虑这种情况。

3)编译器自动生成的临时数据。比如当函数返回值的长度很大(比如40字节)时,返回值会先被推入堆栈,然后给函数调用方。

当返回值的长度很小时(char,int,long等。),它不会被推入堆栈。相反,返回值将首先放入寄存器,然后传递给函数调用方。

4)一些需要保存的寄存器,如ebp、ebx、esi、edi等。之所以保存寄存器值,是因为当函数退出时,可以返回到函数被调用前的场景,继续执行上层函数。

下图是一个函数调用的示例:

ic53fl2xkwz3472.png

上图显示了在Windows下以VS2010调试模式编译时,函数使用的堆栈内存。可以发现,理论上ebp寄存器应该指向栈底,实际上却指向旧的ebp。

在寄存器名前面加上“old”表示调用函数前寄存器的值。

当函数调用发生时:

实参、返回地址、ebp寄存器先堆栈;

然后为局部变量、返回值等分配一块内存。这块内存一般足够大,可以容纳所有的数据,会有冗余;

最后,其他寄存器的值被压入堆栈。

需要注意的是,不同编译器在不同编译模式下生成的函数栈并不完全相同。比如在VS2010中选择了Release模式,编译器会做很多优化,函数栈的外观会消失,对教学没有意义。所以本教程以VS2010调试模式为例进行分析。

关于数据的定位

由于esp的值会随着进入堆栈的数据而变化,根据esp很难找到参数、局部变量等数据,所以在实现中根据ebp定位堆栈中的数据。ebp的值是固定的,数据相对于ebp的偏移量也是固定的。ebp的值加上偏移量就是数据的地址。例如,函数定义如下:

void func(int a,int b){

浮点f=28.5

int n=100

//TODO:

}

电话形式是:

func(15,92);

那么该功能的活动记录如下图所示:

nmb5mfx3y343473.png

这里我们假设两个局部变量相邻,第一个变量和old ebp也相邻(实际上它们之间有一个4字节的空间)。所以,第一个参数的地址是ebp 12,第二个参数的地址是ebp 8,第一个局部变量的地址是ebp-4,第二个局部变量的地址是ebp-8。

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now