- 简介
- 漏洞的攻击方式与分类
- 0-day 攻击
- N-day攻击
- 攻击方式的分类
- 本地攻击Local
- 远程攻击Remote
- DDOS攻击
- web应用攻击
- CPU结构
- CPU的组成部分
- 存储单元Memory
- 主内存Primary Memory
- 附加内存Secondary Memory
- 控制单元Control
- 存储单元Memory
- CPU架构分类
- CISC
- RISC
- CPU的指令周期
- CPU的组成部分
- 基于堆栈的缓冲区溢出
- text
- data
- bss
- Heap
- Stack
- 地址空间随机加载ASLR
- 创建一个漏洞程序
- C语言中的漏洞函数
- GDB调试器
- CPU寄存器
- 数据寄存器
- 指针寄存器
- 变址寄存器
- 栈帧
- 字节顺序
- 基于堆栈的缓冲区溢出漏洞的攻击
- 计算出EIP偏移量
- 排除掉会删除和修改我们shellcode的坏字节
- 创建实际shellcode
- 修改EIP的值为我们shellcode的首地址
- 执行程序
- 漏洞的攻击方式与分类
简介
这篇文章,我们来讲解一下基于堆栈的缓冲区益处漏洞的产生和利用方法的基础知识,缓冲区溢出漏洞是由于程序在编写的时候没有注意安全的编写程序,造成可以向缓存或堆栈写入大量数据,导致特定的寄存器的值被修改,进而允许执行我们的代码,让攻击者可以利用这个漏洞以当前这个进程的权限去执行任意命令
漏洞的攻击方式与分类
有两种基本的攻击类型,一种是0-day攻击,另一种是N-day攻击
0-day 攻击
0-day攻击是指在程序漏洞未公布前这个时间段的漏洞利用攻击,如果程序的开发人员不知道这个程序存在当前漏洞,那么这将非常危险
N-day攻击
N-day攻击是指在程序漏洞公布后到程序的开发人员修补漏洞前这个时间段的攻击,这也是非常危险的
攻击方式的分类
一般攻击方式分为:本地攻击,远程攻击,DDOS攻击,web应用攻击
本地攻击(Local)
本地攻击是利用本地系统上的一些存在安全漏洞的软件,当打开一个文件执行时可以利用漏洞提权,例如,打开一个pdf文件,word文件,excel文件等,我们可以在操作系统里,通过这些存在安全漏洞且拥有比较高权限的应用来执行我们构造的payload
远程攻击(Remote)
远程攻击是利用缓冲区溢出漏洞来获取我们的payload在远程目标主机上运行,远程攻击与本地攻击的区别在于通过 络完成攻击过程
DDOS攻击
DDOS拒绝服务攻击,是制造大量的数据流,造成 络阻塞,使目标主机或者应用崩溃
web应用攻击
web应用攻击是利用系统上的一些存在安全漏洞的web应用,完成攻击,例如,利用web应用漏洞注入命令或者利用漏洞对后端数据库进行攻击等
CPU结构
缓冲区溢出漏洞利用的核心就是控制cpu执行我们的payload,从而完成攻击,下面我们将介绍有关cpu的一些基础知识
CPU的组成部分
CPU是由存储单元,控制单元,运算单元,输入输出单元组成,其中,控制单元与运算单元最重要,运算单元执行运算指令,控制单元控制指令的执行流程,连接处理器,内存和输入输出单元之间的传输过程我们叫做bus系统,如下图:
下面我们分别介绍下每个区块,如下:
.text
这个区块是程序的代码块,存储了程序的执行代码,这个区块只能读取,防止代码被修改,任何尝试修改这个区块的内容就会发生分段错误
.data
这个区块存储了程序进行初始化的全局和静态变量
.bss
这个区块是.data区块的一部分,是被编译器和链接器使用的,用0 bit表示的静态分配的变量
Heap
这个区块是分配给堆内存的,这个区块从.bss区块结束开始,往后逐渐增加到高内存地址
Stack
这个区块是栈内存,栈结构是先进后出,通过栈指针操作
地址空间随机加载(ASLR)
ASLR技术叫做地址空间随机加载,是一种预防内存损坏漏洞被利用的计算机安全技术,地址空间配置随机加载利用随机法方式配置数据的地址空间,使某些敏感数据配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击
创建一个漏洞程序
我们现在用C语言编写一个存在缓冲区溢出漏洞的程序bow.c,漏洞函数strcpy(),如下:
由于操作系统对缓冲区溢出漏洞有ASLR保护机制,这里我们要讲解对这个漏洞的攻击,所以这里我们把ASLR保护机制关闭,命令如下:
下面我们来编译这个bow.c,命令如下:
C语言中的漏洞函数
在C语言中,有一些函数存在缓冲区溢出漏洞,这里简单列举一些,如下:
- strcpy
- gets
- sprintf
- scanf
- strcat
- …
GDB调试器
gdb调试器是linux系统上的调试器,支持多种编程语言程序的调试,例如,C,C++,Objective-C,JAVA等,gdb调试器提供了追踪功能像断点或者栈跟踪,允许我们可以和被调试的执行程序进行交互,我们还可以反汇编一段程序,命令如下:
当前显示的语法是AT&T,我们通过%和$判断语法,下面我们使用intel语法来显示反汇编的代码,如下:
设置gdb默认语法为intel语法,命令如下:
AT&T语法与Intel语法区别如下:
AT&T语法,显示如下:
Intel语法,显示如下:
CPU寄存器
寄存器是CPU的重要组成部分,几乎所有的寄存器都提供一小部分空间用来临时存储数据,然而有一些特定的寄存器,它们被设计只执行特定的功能,这些寄存器被划分为如下一些类型:
- 通用寄存器
- 控制寄存器
- 段寄存器
这些寄存器又被细分为如下:
数据寄存器
32-bit寄存器 |
---|