它山之石可以攻玉,通往电脑的路不止一条。//某黑客网站主打标语^_^
首先举一个例子:
问: 往喝红酒高脚杯里倒红酒为什么总是会倒到三分之二处停止吗?
答: 处去美学的角度,再倒就是滿出来了。
嘻嘻很弱智的一个逻辑吧,但如果把倒酒这个事件引入到程序中来呢?
看看这个程序:
#include<stdio.h>
#include<string.h>
char aa[]="50米的第一次写技术型BLOG";
int main()
{
char bb[5];
strcpy(bb,aa);
int a=0;
for(;a<bb[a];a++)
printf("//0x%x",bb[a]);
return 0;
}
看出问题来了吧!道理还是和倒酒的事异曲同工吧! 拿strcpy同人比,人做了越界检查的工作,而程序中的strcpy没有做这个工作,
你编译不会问题的,只是在运行的时候才才会发现问题来了呵呵。//这个问题就叫做缓冲区溢出,也就是本文的主题了。
好了下面我们来讲讲为什么会出现缓冲区溢出。
当我们输入的是char aa[]="50米的第一次写技术型BLOG";因为要进入main函数,系统是把EIP和EBP保存在堆栈中,然后char bb[5];在堆栈中分配5个char,然后把"50米的第一次写技术型BLOG"保存到里面。因为当初分配的只是5个char而却要放进来远远大于5个char的字串,这样就把保存EBP和ELP给占据掉了。当执行完main函数后,系统会要恢复EBP和EIP的,而EIP已经让覆盖成了别的东西了,但注意,这里系统是不知道的,所以系统就会去执行这不知道的东西。但那个位置同时又是不可以读的,所以就出错啦。所以我们可就可以把EIP覆盖成我们想要去的程序的地方,来完成一些我们想要完成的事。//当然这已经被定义成了一种黑客手段了呵呵
PS:WINDOWS下的堆栈是按从高址到低址的顺序来分配的。