通过数组漏洞覆盖数据

Overwriting data via array vulnerabilities

我正在尝试通过数组索引演示缓冲区溢出(当没有任何边界检查时)。我想做的是通过传递一个错误的值将我的 bool authenticated = false 更改为 true。
我正在使用 GCC 4.8.5

arrayVulnerability(int size)
{
   int array[4];
   bool authenticated = false;

   for (int i = 0; i < size; i++)
   {
      array[i] = size;
   }
}

我的理解是我的内存设置如下:

我希望通过传递一个大于 4 的 int 我能够将该位置覆盖为 true,但它不起作用。我很好奇我的记忆是不是被误解了,或者我是否遗漏了什么?

编辑: 我按照建议打印出位置并得到以下信息:

bool authenticated = 0x7ffc4741612f
array[0] = 0x7ffc47416130
array[1] = 0x7ffc47416134
array[2] = 0x7ffc47416138
array[3] = 0x7ffc4741613c
array[4] = 0x7ffc47416140

所以看起来 bool authenticated 在我的数组之前,我的内存布局是错误的。然而,我仍然对为什么它在我的阵列之前感到困惑。

最有可能实现的自动存储,堆栈,随着对象的分配而向下增长。这意味着array分配了某个地址,然后authenticated分配了地址。您可以做一些快速实验来验证是否是这种情况。查看 array 之前定义的对象的状态,或者打印对象的地址。