缓冲区溢出
缓冲区溢出攻击的原理
1、缓冲区溢出攻击模式:
- 找到可利用的缓冲区溢出隐患
- 注入恶意代码
- 溢出缓冲区
- 重定向到攻击程序
- 执行攻击程序
- 获得控制权
- 任意地执行程序
2、进程在内存的布局:
代码段/文本段:用于放置程序的可执行代码(机器码)。
数据段:用于放置已初始化的全局变量和已初始化的局部静态变量。 已初始化且不为0。
BSS(Block Started by Symbol)段:用于放置未初始化的全局变量和未初始化的局部静态变量。
堆:用于动态分配内存。
堆栈段:用于存放函数的参数,返回地址,调用函数的栈基址以及局部非静态变量。
进程的环境变量和参数
缓冲区溢出可能发生的位置:栈、堆、数据段和BSS段。
3、被调函数栈布局:
函数调用堆栈的操作:
main栈帧:
- 参数入栈,一般从右到左压栈。push
- 返回地址的压栈。call function(返回地址压栈;跳转到function)。
function栈帧:
- push ebp
- 被调函数的局部变量分配内存空间。
- 函数体执行。
- 执行完成,ret。
潜在危害:
- 改写返回地址
- 改写调用函数栈的栈帧地址
- 改写函数指针
- 改写虚函数指针
- 改写异常处理指针
- 改写数据指针
4、缓冲区溢出的途径:
- 内存拷贝。
- 利用数组的最大下标和数组长度的差异产生。
- 利用有符号整数与无符号整数的转换。
- 恶意代码(注入)。exec(/bin/sh)