缓冲区溢出基本思想
2009-05-06 13:41 JiWin 阅读(443) 评论(0) 收藏 举报这是一个很久以前的写的帖子内容,现在把他找出来贴在自己的博客里。
大家有些人对关于缓冲区溢出攻击问题比较模糊。
我想当你知道什么是缓冲区,怎么样溢出,缓冲区溢出后做什么?
这些道理你懂了以后,就会知道缓冲区溢出是不是限制特定的语言或是
应用程序的BUG了.
像典型C语言的缓冲区溢出例子[1],大部分使用strcpy()函数[2],为什么?
因为这个函数有BUG,不检查越界问题[3]。
所以,导缓冲区溢出攻击.针对这个例子,什么是缓冲区?缓冲区是调用这个
函数时候的堆栈(为临时变量分配空间)空间.怎么样溢出?由于不
检查越界问题,用原字符串(长的)复制给目标字符串(短的),
这样导致了原字符串(长的)覆盖了预先分配给目标字符串(短的)空间以后
的空间内容,当然,是用特定的值(一个跳转地址)覆盖了特定的位置(eip取值
的地方).缓冲区溢出后做什么?然后跳(上边溢出的结果)到事先准备的一段通
常叫做"shellcode"的代码段上执行.这个"shellcode"的作用可以和任何应
用程序一样,但是,这是理想的状态.实际由于受到空间的限制,通常"shellcode"比较小.
同样是perl的话,这个缓冲区溢出攻击问题比较少,因为,perl核心VM对越界问
题提供很好检查.
结合上边的说明,你可以考虑一下,如果有一个应用程序使用了C语言编写,并且,使用了
像strcpy()函数(不检查越界问题),然后由用户输入源字符串!
那我们认为这个程序的存在缓冲区溢出攻击问题。因为,一些恶意的用户可能精心布置一个
字符串作为源字符串输入给程序,那将导致程序被缓冲区溢出攻击!
上述还说明一个问题,就是"越界问题"基本是导致缓冲区溢出攻击一大诱因.
任何语言只要对"越界问题"检查比较松散的话,那这个语言容易遭受缓冲区溢出攻击。
但是,我们也要知道缓冲区溢出攻击其实是利用了语言,函数或者程序的BUG。
如果,你的程序不存在这样的BUG,那缓冲区溢出攻击是不可能产生的。
[1]
#include <stdio.h>
#include <string.h>
char src[] =
"jjjjjjjjjj==ADDR";
int main (void)
{
char dest[8];
strcpy (dest, src);
}
这个程序只是为了说明缓冲区溢出例子,我并没有实际测试过是否可以使用。
src字符串的组成可以包含"shellcode+溢出后用的跳转地址",这个src字符
串的长度在相对的条件下是固定的。还有"shellcode"和"跳转地址"是根据不同的语言,程序,系统等的不同而变化的,当然,这些内容到底是什么也就是
研究缓冲区溢出攻击的人,所研究的主要内容。
[2]char *_Cdecl strcpy (char *dest, const char *src);
这个是strcpy()的原型声明,这个函数声明在string.h这个头文件里边。
作用是把const char *src所指向的字符串,符值给char *dest所指向的地址空间。
[3]strcpy()不检查char *src所指向的字符串的长度是否超出
预留给char *dest所指向的地址空间。
[4]通常,我们把一个针对某BUG缓冲区溢出攻击的应用程序叫做"exploit"。