今天读了李毅超、刘丹等的《缓冲区溢出漏洞研究与进展》一文,这篇文章发表在计算机科学这个核心期刊上,其实是一篇综述,但是文章写的比较好。现在做一下这篇文章的笔记。
一、缓冲区溢出攻击的原理
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。
当调用函数copy()后,参数、返回地址、前一个栈的指针、本地变量被依次压入栈中。箭头知名堆栈和内存的增长方向。
函数strcpy()将输入复制到buffer()。由于strcpy()不检查输入变量的边界,当它向buffer()赋值的字符多于512个,输入字符就可能覆盖堆栈中的返回地址并使其指向攻击代码。当程序从copy()返回到main()时,攻击代码被执行。
2、本地指针溢出攻击
返回地址和栈指针受到了保护,缓冲区溢出仍然可以生成。
函数copy()有个本地指针p,并两次调用函数strcpy()。在堆栈中,指针p位于buffer[]下面。攻击过程为:
(1)在执行第一个strcpy()时,攻击代码被注入到缓冲区中,p被覆盖并指向函数printf在全局偏移表GOT(Global Offset Table)中的入口;
(2)通过第二个strcpy()函数将攻击代码的地址赋值到printf在全局偏移表GOT中的入口中;
(3)当程序执行copy()函数中的printf("Finished! ")时,激活攻击代码。
GOT表也是引发溢出攻击的部位,应该得到保护。
3、本地函数指针溢出攻击
本地函数指针也可以被利用成为溢出攻击。
在函数copy()中,strcpy()函数首先被调用,然后fptr所指向的函数被执行。在堆栈中,fptr位于buffer[ ]下,这样fptr就可能被覆盖并指向攻击代码。执行(void)(*fptr)(buffer)时,就会激活攻击代码。
4、BSS函数指针溢出攻击
对BSS(Block Stoage Segment)中函数指针的利用。由于利用发生在BSS中,诸如StackGuard、IBM SSP等这样的堆栈溢出防护技术对这类攻击无效。
二、检测与防护研究
1、基于目标代码分析
Fuzz工具。
2、基于源码分析
(1)基于源码静态检测
(2)基于源码动态检测
3、基于编译器的方法
4、基于硬件的方法
5、改造C语言库函数
6、基于操作系统的方法
7、其他防护技术
三、发展趋势
从软件走向硬件,从单机制走向多机制。