基于缓冲区溢出的攻击实验报告 本文关键词:缓冲区,溢出,攻击,实验,报告
基于缓冲区溢出的攻击实验报告 本文简介:一、实验名称:基于缓冲区溢出的攻击二、实验目的:1.学习并掌握缓冲区溢出的基本原理2.学习缓冲区溢出攻击利用的技术三、概念与原理1.缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多
基于缓冲区溢出的攻击实验报告 本文内容:
一、
实验名称:基于缓冲区溢出的攻击
二、
实验目的:
1.学习并掌握缓冲区溢出的基本原理
2.学习缓冲区溢出攻击利用的技术
三、
概念与原理
1.缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是
程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区
又被称为“堆栈“.
在各个操作进程之间,指令会被临时储存在“堆栈“当中,“堆栈“也会出现缓冲区溢出
。
2.通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void
function(charstr)
{
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
intret
=
0;
12
printf(“%x/n%x/n“,13
//while((ch[i++]
=
getchar())
!=
/n
);
14
//while(scanf(“%d“,ch[i++]));
15
while(
i
>
8)
%
256;
19
ch[i++]
=
(char)((int)
20
ch[i++]
=
(char)((int)
21
printf(“i
=
%d
%d
%s/n“,i,a,ch);
22
//ret
=
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)
/x
//函数的返回地址为:0x080483fr
五、
实验总结
通过本次实验,了解到缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。因此,如何及时有效地检测出计算机网络系统入侵行为,已成为网络安全管理的一项重要内容。