内存越界引用与缓冲区溢出

1、什么是内存越界引用(Out-of-Bounds Memery)
  啥叫内存越界引用?按照CSAPP里面的说法就是:

什么是缓存区溢出(Buffer Overflow)

1、什么是内存越界引用(Out-of-Bounds Memery)

  啥叫内存越界引用?按照CSAPP里面的说法就是:

  • C语言对于一个数组的引用,是不对该数组进行任何边界检查的。通俗来讲,你用C语言定义一个局部变量数组,大小为3char 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 
#include 
#include 

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

你可能感兴趣的:(内存越界引用与缓冲区溢出)