我正试图通过数组索引来演示缓冲区溢出(没有任何边界检查时)。我正在尝试通过传递错误的值来将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
在我的数组之前,并且我的内存布局错误。我仍然对为什么它在我的数组之前感到困惑。
答案 0 :(得分:2)
自动存储最有可能的实现是堆栈,随着对象的分配,其向下扩展 。这意味着为array
分配了一个特定的地址,然后为authenticated
分配了一个低地址。您可以做一些快速实验来验证是否是这种情况。查看之前 array
中定义的对象的状态,或打印对象的地址。