本文主要是介绍seedlabs_网络攻防技术_lab4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
lab4 缓冲区溢出实验
一、实验要求
本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储(如缓冲区)和控件存储(如返回地址)的混合造成的:数据部分的溢出会影响程序的控制流,因为溢出会改变返回地址。
本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的root权限。除了进行这些攻击实验之外,还将试验几种针对缓冲区溢出攻击的对策。学生需要评估这些计划是否有效,并解释原因。
二、实验步骤及结果
task1: Get Familiar with the Shellcode
- 进入shellcode文件夹,修改shellcode_32.py ,使其能够删除文件
- 编译运行(需要先行创建一个tmpfile)
task2: Level-1 Attack
- 进入server-code文件夹,执行下列命令
make
make install
- 回到labsetup文件夹下,执行下列命令
dcbuild
dcup
- 保持上述终端窗口,另开一个终端到attack-code文件夹下执行下述命令
nc 10.9.0.5 9090
- ctrl+C终止后,可以看到server显示
- 修改exploit.py为下图
6. 注意要关闭ASLR(地址空间随机化),不然后面运行会失败
sysctl -w kernel.randomize_va_space=0
像这样两次输出一致且都是0xffffxxxx的形式就成功了
- 再根据ebp和buffer address计算ret和offset
ret = ebp + 8
offset = ebp - buffer address + 4 # 需要注意统一进制
- 运行exploit.py后,传输badfile,查看输出,得知成功运行
task3: Level-2 Attack
- 输入
echo hello | nc 10.9.0.6 9090
,连接2号服务器
可以看到只提供了buffer address
- 根据文档可知offset范围为100~300
- 新建一个exploit2.py,修改代码如下由于不知offset,所以用循环进行尝试
4. 运行并传输文件,攻击成功
task4: Level-3 Attack
- 输入
echo hello | nc 10.9.0.7 9090
,连接3号服务器
可以看到3号服务器使用64位系统,rbp就是上面的ebp
- 修改exploit3.py,注意shellcode部分使用shellcode_64.py中的代码
ret = buffer address
offset = rbp - buffer address + 8 # 注意进制 32位系统+4,64位系统+8 十进制
- 运行并传输文件,攻击成功
task5: Level-4 Attack
- 连接服务器
4号服务器与3号服务器相同,但是buffer size更小
2. 与task4原理相同,修改exploit4.py文件如下
- 运行后传输文件,成功
task6: Experimenting with the Address Randomization
- 开启ASLR,观察它是如何影响攻击的
sudo /sbin/sysctl -w kernel.randomize_va_space=2
- 向1号服务器和3号服务器发送hello信息,多发送几次,进行观察
为什么ASLR使缓冲区溢出攻击更加困难
地址空间随机化(Address Space Layout Randomization)(ASLR)是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。ASLR通过对攻击者在进行缓冲区溢出攻击时所要用到的内存布局中的偏移做了随机化,加大了攻击成功的难度,从而增强了系统的控制流完整性。这种技术使得系统上运行的进程的内存地址无法被预测,使得与这些进程有关的漏洞变得更加难以利用。
通常认为ASLR在64位系统上效果更好,因为64位系统有更大的可随机的地址范围。
克服32位系统的ASLR
根据pdf给出的shell脚本进行循环攻击
攻击成功就会停下,理论上十分钟内能得到结果
但是我这里运行了16分钟、11万次都没有成功
task7: Experimenting with Other Countermeasures
a. Turn on the StackGuard Protection
进入server-code文件夹,移除gcc的栈溢出保护机制-fno-stack-protector。编译stack.c,并将badfile作为输入
可以看到检测到了 stack smashing
b. Turn on the Non-executable Stack Protection
进入 shellcode 文件夹,去除 -z execstack
编译 call_shellcode.c 并运行
可以看到,发生了segmentation fault,栈不可再用
这篇关于seedlabs_网络攻防技术_lab4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!