1、什么是内存越界引用(Out-of-Bounds Memery)
啥叫内存越界引用?按照CSAPP里面的说法就是:
什么是缓存区溢出(Buffer Overflow)
1、什么是内存越界引用(Out-of-Bounds Memery)
啥叫内存越界引用?按照CSAPP里面的说法就是:
- C语言对于一个数组的引用,是不对该数组进行任何边界检查的。通俗来讲,你用C语言定义一个局部变量数组,大小为3
char a[3] = {'a', 'b', 'c'};
,但你可以对数组下标超过2的元素e.g. a[11]
进行读写操作。
1.1内存越界引用的前提条件:
一般局部数据会被存储于寄存器中,但有时会发生,局部数据不得不存储于内存(栈)中的情况。主要是以下三种情况(At times,However, local data must be stored in memory rather than registers.Common cases of this include these):
- 1、没有足够的寄存器用于存储局部数据。
- 2、取地址符
&
用于局部变量,因此我们必须能够为其生成一个地址。 - 3、局部变量如果是数组、结构体,因此我们必须能够对数组、结构体进行解引用。
这里我们着重关注第三条:局部变量如果是数组、结构体,会被procedure存储于栈中。
我们看下面这个有趣例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char d = 'd';
char a[3] = {'a', 'b', 'c'};
int i;
for(i = 0; i <= 15; i++)
{
printf("a[%d] = %c ", i, a[i]);
}
printf("\n");
printf("d = %c\n", d);
printf("----------------------\n");
a[11] = 'e';
for(i = 0; i <= 15; i++)
{
printf("a[%d] = %c ", i, a[i]);
}
printf("\n");
printf("d = %c\n", d);
return;
}
输出结果如下:
[root@study csapp]# ./a.out
a[0] = a a[1] = b a[2] = c a[3] = ▒ a[4] = ▒ a[5] = a[6] = a[7] = a[8] = a[9] = a[10] = a[11] = d a[12] =
a[13] = a[14] = a[15] =
d = d
----------------------
a[0] = a a[1] = b a[2] = c a[3] = ▒ a[4] = ▒ a[5] = a[6] = a[7] = a[8] = a[9] = a[10] = a[11] = e a[12] =
a[13] = a[14] = a[15] =
d = e