一、什么是缓冲区
缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是栈、堆和静态数据区。在C/C++中,通常使用字符数组和malloc/new之类内存分配函数实现缓冲区。溢出指数据被添加到分配给该缓冲区的内存块之外。溢出区溢出时最常见的程序缺陷。
当向局部数组缓冲区里写入的数据超过为其分配的大小时,就会发生缓冲区溢出。
二、实例代码
#include <stdio.h>
void foo() {
int a, * p;
//强制改变p地址位置,而这个位置是没有分配的
//为什么一定呀把&a强转为char*类型?
p = (int*)((char*)&a + 12);
*p += 12;
}
int main() {
foo();
printf("First printf call\n");
printf("Second printf call\n");
return 0;
}
在foo()中,p = (int*)((char*)&a + 12)的目的为让p拿到调用foo()时入栈的返回地址,然后*p += 12是为了修改foo()入栈时地址的值,让其指向printf("Second printf call\n")指令的起始地址,这样得到结果就只输出"Second printf call\n"了,但是我运行结果崩溃了,并没有如此顺畅。