• 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

我们先来看下面这个例子:

#包含stdio.h

int main(){

char str[10]={ 0 };

gets(str);

printf('str: %s\n ',str);

返回0;

}

在main()函数中定义一个字符数组,并通过gets()给它赋值。

在VS2010调试模式下运行程序,当输入字符不超过10个时可以正确输出,但当输入字符过多时会出现运行时错误。例如,如果您输入“12345678901234567890”,将出现以下错误:

qvzhqatw4ym3142.png

这是为什么呢?我们先来看看main()函数的堆栈:

gjbpxbnukql3143.png

局部数组也在堆栈上分配内存。当输入‘12345678901234567890’时,数组溢出,占用“4字节空白内存”、“旧ebp”和“返回地址”所在的内存,覆盖原来的数据。这样,在执行main()函数时,会得到一个不正确的返回地址。这个地址上的地址

c语言不检测数组溢出,这是一个典型的由于数组溢出而覆盖函数返回地址的例子。我们称这样的错误为“堆栈溢出错误”。

注意:这里所说的“堆栈溢出”是指堆栈上的某些数据过大,覆盖了其他数据,与《栈的概念以及栈溢出》节所说的堆栈溢出并不相同。

数组在栈上本地分配内存,没有检测到数组溢出,这是栈溢出的根源。除了上面提到的gets()函数,strcpy()、scanf()等可以向数组写入数据的函数都有堆栈溢出的风险。

以下是使用strcpy()函数导致堆栈溢出的示例:

#包含stdio.h

#包含字符串. h

int main(){

Char *str1='这是岳麓书院';

char str 2[6]={ 0 };

strcpy(str2,str 1);

printf('str: %s\n ',str 2);

返回0;

}

把str1复制到str2显然超出了str2的接受范围。它会溢出并覆盖返回地址,导致main()函数返回时出错。

一般情况下,堆栈溢出不会造成严重后果,但如果一个用户精心构造堆栈溢出,使返回地址指向恶意代码,就会更加危险,这种攻击通常被称为堆栈溢出攻击。

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