1.2 啤酒和杯子――缓冲区溢出原理

第一节课,各位同学都规规矩矩的坐在位置上,看着老师,大气也不敢出。

老师带着眼镜,一副精干的样子,看出了大家紧张的神情,于是说道:“大家这么紧张干嘛是怕这门课的技术还是怕这门课的老师――我啊我很好说话的,都是年轻人嘛;而技术,就比我更好啦――它是不会说话的。”

“呵呵!是呀!是呀!”大家听了老师的独白都笑了,气氛一下活跃了不少。

老师停了一下,问道:“同学们,这门课叫‘网络攻防’,那你们知道网络上的攻击手段哪些么”

大家听了,马上七嘴八舌的应到:“一些安全杂志上有介绍,好像有注入、缓冲区溢出、劫持、嗅探……”

“哈哈,对!”老师满意的说道,“大家说得很好!攻防是个全方位的问题,涉及到诸多技术,但我们课时有限,第一学期只能讲几个有限的部分。现在最流行的有攻击手段两种方式,一种是SQL注入,另一种就是缓冲区溢出攻击。我们选一个作为首先讨论的主题吧!”

“好啊,好啊!”

“不过讲什么呢好像都挺有意思的。”一位女生说道。

“不知道,投硬币吧!”一个胖乎乎的同学说。

老师眼镜一亮,说:“对,真是个好办法!”

老师摸出一个硬币,拈在手中说:“如果是正面就先讲缓冲区溢出,反面就先讲SQL注入。”语音刚落,硬币就在空中划出一道美妙的弧线,落在地上转了几圈后停了下来。

前排的几个同学壮着胆子围上去看,叫道:“是正面也!”

“好!那就先讲缓冲区溢出!注入留在以后讲!”老师说道。

“不过似乎很难也……”一个瘦瘦的但很精神的同学说。 “不用怕!大家只要有信心、有毅力,就一定能战胜,Follow me!”

“好,首先让我们来认识一下缓冲区以及缓冲区溢出吧!”老师说。

“先作下类比,如果某个人把一瓶啤酒全部倒入一个小杯子中,那装不下的啤酒就会四处冒出,流到桌子上,这个大家都清楚吧!”

“是啊!是啊!”男生们都遗憾的说到,“那好浪费啊!”

那个胖胖的同学说:“这么好的天,啤酒、小菜,再加上超爆DVD大片,好舒服啊!”

“就是啊,谁这么做的拖出来打一顿!”大家的情绪被带动起来了。

“安静!安静!”老师好不容易把持序维护下来,然后兴致索然的说,“我只是打个比方而已!你们什么都能联想到吃。那位同学,你叫什么名字呢”

那位胖胖的同学老实的答道:“我叫玉波。”玉波果然像名字一样,长的白白胖胖的,一张圆乎乎的脸,挺可爱的样子。

“不过我很理解你们,食堂的饭菜是太难吃了。”老师挺同情的说道,“大学食堂就是伤心太平洋啊!”

“哈哈哈哈……”同学们都乐了,教室里充满了愉快的笑声。

等大家平稳下来后,老师继续说道:“同样的道理,在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。缓冲区就很像那个啤酒杯,用来装东西,而且大小固定。”

“向缓冲区内填充数据,如果数据的长度很长(如同那瓶啤酒),超过了缓冲区(那个啤酒杯)本身的容量,那么结果就如同啤酒一样,四处溢出,数据也会溢出存储空间!装不下的啤酒会流到桌子上,而装不下的数据则会覆盖在合法数据上,这就是缓冲区和缓冲区溢出的道理。”

“当然在理想的情况下,程序检查每个数据的长度,并且不允许超过缓冲区的长度大小,就像在倒啤酒的时候,啤酒要冒出杯子时我们就停止。但有些程序会假设数据长度总是与所分配的存储空间相匹配,而不作检查,从而为缓冲区溢出埋下隐患。”

“OK,那我们如何利用缓冲区溢出呢在一般情况下,就像啤酒会到处流满桌面一样,溢出的数据会覆盖掉任何数据、指针或内容。除了破坏之外,对攻击者来说没有任何好处。但我们可引导溢出的数据,使计算机执行我们想要的命令。这就是很多漏洞公告上说的:‘黑客可以用精心构造的数据……’。道理就是这样。”

“如果初学,还不熟悉这个概念,可先把缓存区溢出利用理解为允许攻击者往某个程序变量中放一个比期望长度要长的值,由此以当前运行该程序的用户的特权执行任意命令。”

“而具体的利用和方法,就是如何精心构造。”老师最后说道。