这是一道缓冲区溢出的题,代码如下:
#include <stdio.h> //头文件
#include <windows.h>
void Fun() //定义函数
{
while(1) //无限循环
{
printf("奥里给!\n"); //输出内容
}
}
int check() //定义函数
{
int arr[8]; //定义数组,移动可以存储9个数
arr[9] = (int)&Fun; //???这是越界存储了什么,为什么会读出Fun()里的内容
return 0;
}
void main() //程序入口
{
check(); //调用函数
getchar(); //输入内容
return; //程序结束
}
一共四个问题:
这里的(int)&Fun; 是什么意思?为什么加上它就可以输出Fun()里的内容?
如能解答,万分感谢!
我给这个数组付了五个值,第一个00000001就是arr[0]的位置,向下数八个到arr[9],正好是函数的返回地址,汇编语言中的ret直接使用这个位置的地址,正好你用&提取了FUN函数的地址,在这里形成了覆盖,ret指令就直接调用了fun函数的起始地址,就奥利给给给给给给了
---------老八逆向--------
https://m.wenda.so.com/q/1487437341721451
c/c++不会对数组越界进行报错,只会出现warning,
arr[9] = (int)&Fun;只是将fun函数的入口地址转换为整型赋给arr[9]的位置哪里而已,不会执行fun函数