上次讲的是栈溢出,其实不止是栈,在使用堆时也会溢出。
例如:
#include <stdio.h>
#inlcude <string.h>
int main(){
char *name;
char *color;
color=malloc(10);//使用内存分配函数在堆中
name=malloc(10);//分配内存
strcpy(name,"leisure");
printf("please input your favorite color/n");
gets(color);//著名的缓冲区溢出函数
printf("your name is %s/n",name);
printf("your favorite color is %s/n,color);
return o;
}
这里的实例程序中使用了malloc函数来为变量分配内存,后面又调用了典型的缓冲区溢出函数gets来获得输入,当我们输入的字符大于分配的缓冲区时,就会溢出掉,而去把name值给覆盖了。虽然我们分配的是10字节,但是其实分配的是16字节,所以当我们输入blueblueblueblueroot后,输出将显示name是root!而color就是blueblueblueblueroot!
可以看出,堆的缓冲区溢出比栈缓冲区溢出简单得多,也更好理解。下面是有用的工具,为了使攻击程序开发者和用户(脚本小子)之间有一定的交互性,H.D Moore和Spoonm发布了Metasploit,这是一个漏洞攻击程序架构,使用Ruby和部分C语言编写,可以运行windows和Linux下