我今天看视频学习C++内存管理学到栈攻击的知识点时遇到了一个问题:
以下程序在linux中通过
gcc 00_code.c -z execstack -fno-stack-protector
开启堆栈可执行机制并关闭栈保护机制后,在func1中通过数组越界访问的方式成功获取func2的使用权
我不理解的地方是为什么在func1中通过printf("a[n] = %d\n",a[6]);会成功调用func2,通过函数名怎么可能会让函数执行的呢?还是说在func1运行完出栈的时候调用的func2呢?
#include <stdio.h>
int func2()
{
printf("stackflow success!\n");
while(1);
}
void func1()
{
int a[4];
a[6] = func2;
printf("a[n] = %d\n",a[6]);
}
int main(int argc, char const *argv[])
{
func1();
return 0;
}
我觉得有可能是在func1函数出栈的时候调用了func2,我通过在func1最后加了一个while(1)循环,发现只要func1不退出,func2就不会被调用(只是猜测,具体我还是一头雾水)