假设我写了
vector<int> example(5);
example[6];
它与以下内容有什么区别?
vector<int> example(6);
example[5];
在第一种情况下,我试图访问一个不存在的、未声明的索引。这会导致恶意代码执行吗?是否可以将某种代码放在与 example[5]
对应的内存部分中,并由像上面第一个代码那样编写的程序执行?
第二种情况呢?是否仍然可以将代码放置在 example[5]
的内存区域中,即使它应该保留给我的程序,即使我没有在其中写入任何内容?
最佳答案
Could that result in malicious code execution?
不,这会导致“仅”未定义的行为。
简单的代码执行漏洞通常写入超过堆栈分配的缓冲区的末尾,从而覆盖返回地址。当函数返回时,它会跳转到恶意代码。写入始终是必需的,否则程序的地址空间中就不会存在恶意代码。
对于 vector
,发生这种情况的可能性很低,因为元素的存储空间不是在堆栈上分配的。
通过写入堆上的错误位置,漏洞利用也是可能的,但要复杂得多。
关于c++ - 访问不存在的数组索引和访问现有但为空的索引之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29431559/