栈溢出攻击最基本原理
函数在调用的过程中,函数在调用之前呢,会将调用完这个函数之后的下一条命令的地址保存到LR中。
void func()
{int a[4];a[6] = 100;
}
这个函数在用gcc编译的时候是不会报错的,所以我们可以在尝试之后,修改LR的值,让代码返回到一个我们自己的函数中。
void shellcode()
{while(1);
}
void func()
{int a[4];a[6] = shellcode;
}
比较新的gcc编译器,会在边界几个位置中,设定一个随机值,程序执行完看那个随机值有没有变化,如果说变化了,就说明那个你越界访问了。但也是只限周围的几个(左右一两个)。
这里再分享一道笔试题,nice公司的一道笔试题:下面这段代码的执行结果是什么?似乎是相同的道理。
#include <stdio.h>
int main()
{int i = 0;int arr[] = {1,2,3,4,5,6,7,8,9,10};for(i=0; i<=12; i++){arr[i] = 0;printf("nice\n");}return 0;
}