关于缓冲区溢出

来源:互联网 发布:ib是什么意思网络 编辑:程序博客网 时间:2024/05/16 13:43

Part 1 书评

最近在看得一本书是《深入理解计算机系统》,英文原名是Computer System: A Programmer’s Perspective。也是一个偶然的机会才在别人的书桌上随便翻开看看的。结果一发不可收拾,现在自己花了RMB72购入囊中,列入珍藏的书目中了。正如英文的原名所叙述的,from a programmer’s perspective, 故名思义,就是从程序员的视角来看待一个计算机系统。现有的一些计算机原理书,往往过于偏硬,什么门电路啊、译码器啊讲的非常深入,但与现实就相距甚远,常常让人理解起来没有参考。这部书,我刚看完第三章,从页码来看差不多有1/4多了。现在最大的感触就是书上讲的东西下来都可以自己在机器上实践(特别是第三章“程序的机器级表示”),把汇编语言与高级的C语言有机地结合起来学习,通过熟悉的C语言的知识去影射难以理解汇编代码,我觉得是这章最成功的最出彩之处。不像有的汇编书一上来就是一大堆指令让人记忆,这部书把C的代码/控制结构直接汇编成汇编语言的形式,用多少指令才讲多少,步步为营。看完前三章,我最大的收获是对程序的理解有上了一个新的高度。以前只是局限于高级语言的代码,各种语言(比如我学过的QBPascalCC++)都是分散的模块。现在站在机器级代码的角度,各种语言的殊途同归,大家本事同根生嘛!!

Part 2 关于缓冲区溢出攻击

还有一大收获是对程序堆栈的理解。在子程序中定义的局部变量都是放在程序堆栈中的,而子程序/函数的返回地址也是放在程序堆栈中。返回地址是什么?就是直接传递给指令指针(Instruction PointerIP)的指。如果改变了IP,也就相当于改变了程序的流向!(想到了什么?对,这就是恶意程序!)那么怎样才能去改变IP呢?C中指针的概念。我们在子程序中申请一个字符串,系统就会在程序堆栈中安排一个缓冲区(buffer)来储存。这个缓冲区当然是有限的。如果我们输入的字符串内容(假设程序与用户交互会要求输入的是字符串)超过了缓冲区的长度(称为缓冲区溢出),那么输入的内容就会覆盖程序堆栈中之前保存的内容。这,就给我们改写返回地址创造了条件!!记住,机器级的程序可没有人像的那么聪明。早期的恶意攻击程序大概是这样子的:在提示输入数据时(字符串),利用有效的空间输入攻击者想执行的机器代码(16进制表示的,基本看不懂,得用其他程序来生成),然后利用缓冲区溢出来改写子程序的返回地址,把这个地址指向刚才输入的机器代码的开始位置。这样当该子程序返回时,正常的程序流程就被破坏了,转而去执行攻击者预先设定的代码(可以格式化磁盘,可以在远程主机上留下后门等等,自己想)。接下来,这台“肉鸡”就任你宰割了,哈哈!当然这些是早期的攻击办法,现在的系统(软件/硬件)都能实现让指令只在代码段执行。这样在程序堆栈段输入的代码,即使强制是IP跳转到那里,也不能执行,因为位于代码段之外的指令时非法的。我打算进行的一个缓冲区溢出试验就遇到了这个问题。如果把返回地址改为代码段的随便一个地址,可以继续执行下去,其实程序根本不知道它的流程已经被我改掉了;但是设为堆栈段的地址,在ret(汇编指令,返回前一个函数之意)时有收到一个段错误(segmentation fault),原因前面已经叙述过了。看来,补丁太多了也不完全是件好事啊!呵呵。

原创粉丝点击