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