它山之石可以攻玉,通往电脑的路不止一条。//某黑客网站主打标语^_^

 

它山之石可以攻玉,通往电脑的路不止一条。//某黑客网站主打标语^_^

首先举一个例子:

问: 往喝红酒高脚杯里倒红酒为什么总是会倒到三分之二处停止吗?

答: 处去美学的角度,再倒就是滿出来了。

嘻嘻很弱智的一个逻辑吧,但如果把倒酒这个事件引入到程序中来呢?

看看这个程序:
#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下的堆栈是按从高址到低址的顺序来分配的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值