缓冲区溢出
缓冲区溢出简介
计算机程序的运行依赖于函数调用栈。栈溢出是指在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。
实现缓冲区溢出,要满足两个条件:
- 第一,程序要有向栈内写入数据的行为,并且写入长度要大于目标存储长度;
- 第二,程序并不限制写入数据的长度。
历史上第一例被广泛注意的**“莫里斯蠕虫”病毒**就是利用C语言标准库的 gets() 函数并未限制输入数据长度的漏洞,从而实现了栈溢出。
缓冲区溢出两种类型:
- 基于栈的缓冲区溢出——目标存储在栈中
- 基础堆的缓冲区溢出——目标存储在堆中
缓冲区溢出导致任意代码执行——通过返回地址覆盖技术。任意代码执行导致,在目标主机上进行一些非法获权操作——生成一个root shell,打开一个新端口或者创建一个新用户。
栈溢出
实现栈溢出,要满足两个条件。第一,程序要有向栈内写入数据的行为;第二,程序并不限制写入数据的长度。历史上第一例被广泛注意的“莫里斯蠕虫”病毒就是利用C语言标准库的 gets() 函数并未限制输入数据长度的漏洞,从而实现了栈溢出。
背景知识
函数调用栈
- 定义:程序运行时内存一段连续的区域
- 作用:用来保存函数运行时的状态信息
- 包括:函数参数与局部变量
- 称之为“栈”是因为:发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶;在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态。函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。
寄存器
分为通用寄存器和特殊寄存器
- 通用寄存器:
- 一般寄存器e*x(a, b, c, d)
- 引索寄存器e*i(s, d)
- 特殊寄存器:可以使用MRS和MSR特殊寄存器访问指令来访问特殊寄存器
- MRS:读特殊寄存器
- MSR:写特殊寄存器
工具准备
1. 第一步pwntools的安装
检查kali版本
查看linux机器是32位还是64位的方法:
file /sbin/init 或者 file /bin/ls
/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
如果显示 64-bit 则为64位;
file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
如果显示为32 bit 则为32bit;
查看了一下,发现我的kali是64位的
file /bin/ls
不同版本的ubuntu可以应对不同的glibc调试
开始安装pwntools
安装的命令很简单
pip install pwntools
关于什么是pwntools ,官方文档中是这样说的: pwntools是一个CTF框架和漏洞利用开发库。它以Python编写,专为快速原型设计和开发而设计,旨在使漏洞利用编写尽可能简单。
当然也可以这样:
在中端输入下面的内容
git clone https://github.com/Gallopsled/pwntools
cd pwntools
python setup.py install
打开一个python的小窗口导入一下pwn试试看
python
from pwn import *
asm("xor eax,eax")
如果输出结果如下就说明安装成功:
'1\xc0'
2.安装Capstone
当然也是差不多的样子
git clone https://github.com/aquynh/capstone
cd capstone
make
make install
1234
3.安装peda
gdb-peda:gdb方便调试的工具,类似的工具有gef,gdbinit。
安装也很简单
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
装完就可以方便的调试了:
常用命令
file 文件名