数组越界问题分析_java数组越界怎么处理

数组越界问题分析_java数组越界怎么处理通常情况下在C语言中我们定义一个大小为5的数组是这样的:intarr[5]={1,2,3,4,5};1,2,3,4,5这五个数字对应的下标是0,1,2,3,4,当我们想访问数组中第一个数字时,通常会使用arr[0]的形式去访问,但是,如果我们使用arr[5]=6来对超过数组大小的地方进行赋

大家好,欢迎来到IT知识分享网。

通常情况下在C语言中我们定义一个大小为5的数组是这样的:

int arr[5] = {1,2,3,4,5};

1,2,3,4,5这五个数字对应的下标是0,1,2,3,4,当我们想访问数组中第一个数字时,通常会使用arr[0]的形式去访问,但是,如果我们使用arr[5]=6来对超过数组大小的地方进行赋值,会发生什么?
数组越界问题分析_java数组越界怎么处理

编译之后,发现编译器并没有报错,也没有警告,但是我们知道,这里其实已经发生了数组越界问题。
那我们先来看一下不进行数组越界操作的时候反汇编是什么样的:
数组越界问题分析_java数组越界怎么处理

再来看一下对数组进行越界操作的时候是什么样的:
数组越界问题分析_java数组越界怎么处理

对比之后发现在添加了一句arr[5]=6之后,反汇编代码这里多出一句0040104B mov word ptr [ebp],6,也就是6被存到内存地址为[ebp]的地方了。
参照上一篇文章,可以知道[ebp]是存放原ebp的地址,也就是函数执行第一步的push ebp,一个函数在开始执行前,会将下一条指令的地址压入栈中,位置是[ebp+4],这里我们注意到,arr[5]的位置是[ebp],那么推测[ebp+4]的位置就是arr[6],存放在这里的值在函数结束之后会被存放到EIP中当成下一条指令的地址,执行此处的指令。
那么我们要是在arr[6]的位置换成另一个函数的地址,那么在这个函数结束后不就可以自动调用另一个函数了,于是将原来的代码改成这样:

#include <stdio.h>

void First();
void Hello();

int main(void)
{
	First();
	return 0;
}

void First()
{
	int arr[5] = {1,2,3,4,5};
	arr[6] = (int)Hello;
}
void Hello()
{
	printf("Hello World!");
	getchar();
}

这样,根据我们的构想,在主函数里面调用了First函数,但是在First函数结束后,会调用Hello函数:
数组越界问题分析_java数组越界怎么处理

这里可以看到返回地址被改成了Hello函数的入口地址:
数组越界问题分析_java数组越界怎么处理
从上面就可以看出数组越界的危害性。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29676.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信