缓冲区溢出

实验文件:https://download.csdn.net/download/qq_49712456/35501236

一、 实验目的

1)更好地从硬件层面理解程序调用过程
2)理解操作系统为实现程序安全提供的保护
3)完成实验后,能得到启发,写出更安全可靠的代码

二、 实验环境

1)获取权限
在这里插入图片描述

三、 实验过程

1)第一关第一问

利用缓冲区溢出,调用touch1
gdb attack

在这里插入图片描述

在getbuf函数处设置断点并运行程序
在这里插入图片描述

反汇编最顶层函数: test()
在这里插入图片描述

在第三行,test调用了getbuf函数
反汇编getbuf函数
在这里插入图片描述

第一行,getbuf开辟了0x28字节的空间,即40byte
但Gets函数读取没有限制,可以超过40byte
getbuf的返回地址为test
为了不让getbuf返回到test中,而返回到touch1
要将getbuf的返回地址用touch1的地址覆盖
字符串中要用40个字节占位置,再填入8字节的touch1地址
反汇编touch1
在这里插入图片描述

其开始地址为0x0000000008000894
填入地址时用小端法
在这里插入图片描述

退出程序
在这里插入图片描述

为避免遭遇段错误,先关闭操作系统的ASLR
sudo bash -c ‘echo 0 > /proc/sys/kernel/randomize_va_space’
在这里插入图片描述

运行后,通关
在这里插入图片描述

得到下一个的重要参数Cookie:383875107

2)第一关第二问

在 getbuf函数返回的时候,执行 touch2而不是返回 test
要求以正确的参数调用touch2,即要让输入参数val=cookie
注入新的代码,让touch2以为它接收到的参数是自己的 cookie
run程序后,反汇编touch2
在这里插入图片描述

第一行可得到touch2的首地址0x0000555555554acd
第三行得到cookie的存储地址,查看cookie的值
在这里插入图片描述

cookie的值取第一个数0x0000000016e17823
由此可得到攻击代码:
将rdi寄存器的值修改为cookie值,使输入参数val=cookie
将touch2的首地址传给一个寄存器,再将该值压入栈中
在这里插入图片描述

将该代码写入touch2.s文件,并汇编
在这里插入图片描述

得到其对应的二进制代码
在这里插入图片描述

将该二进制代码填入exploit.txt中
为了完全覆盖40字节地址,要将剩余位用0补满:
48 c7 c7 23 78 e1 16 49
b8 cd 4a 55 55 55 55 00
00 41 50 c3 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
函数返回到getbuf函数中,将返回地址改为getbuf的栈指针指向的地址
再getbuf处设置断点
在这里插入图片描述

单步运行到Gets函数处
在这里插入图片描述

可查看Gets函数开辟空间后栈指针rsp所指位置
在这里插入图片描述

rsp指针:0x7fffffffde10
用小端法将该地址输入到exploit.txt中,覆盖返回地址
在这里插入图片描述

运行后通过
在这里插入图片描述

3)第二关

无法插入指令执行,利用已有的指令进行攻击
调用touch2函数。即要把cookie压入%edi中再访问%rsp的值
用命令objdump -d attack查看所以函数
在这里插入图片描述

在0000000000000b20 <__libc_csu_init>中找到
b82: 41 5f pop %r15
在这里插入图片描述
在这里插入图片描述

从b83截断代码,就可以获得这个结果
将这个函数反汇编
在这里插入图片描述
在这里插入图片描述

取b83处的地址,即0x555555554b83
攻击代码:
前40字节覆盖开辟的空间
第六行是gdb调试后获得的b83处地址
第七行是cookie的值
第八行是touch2的地址
在这里插入图片描述

运行通过

四、 问题及反思

1)操作报错:
安装环境时,报错Unable to locate package lib32ncurses5
将apt-get install libncurses5改为apt-get install libncurses5-dev即可解决
2)子系统和kali虚拟机都无法运行第一关第二问和第二关
会报错
在这里插入图片描述

最后,借同学的电脑,用Ubuntu虚拟机完成实验

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ETO降临派

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值