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