缓冲区作用:在内存中预留指定大小的一些存储空间对I/O数据做临时的存储,可以用来减少物理读写次数,如从磁盘读取信息,可以先把读出的数据放在缓冲期,再从缓冲区读取,等到缓冲区的数据全部读取完成后,再去磁盘读,这样可以解放CPU。
缓冲区溢出:缓冲区溢出对于程序来说是个重大bug,一般遇到这种问题会导致程序运行失败,活着设备重启,之前测试中也经常遇到,常见会有反复重启的问题。缓冲区溢出在安全上也是个重要漏洞,相当于开后门,攻击者可以通过缓冲区溢出来执行恶意代码,如攻击覆盖了函数返回地址,且有root权限,通过该溢出可以提权以及控制被攻击主机。
缓冲区溢出原理:
1.程序缓冲区比作一个个内存单元,如预先分配10的内存空间,按照预先设计,输入数据不超过10
2.输入了20的数据,程序没有对输入的数据量进行检查,存入之后,缓冲区的10被占用,剩下的10占用了其后的内容,覆盖了相邻的10的数据
3.此时溢出的数据可以使一些指令,即可以执行一些恶意代码
缓冲区:在内存中预留指定大小的一些存储空间对I/O数据做临时的存储,可以用来减少物理读写次数,如从磁盘读取信息,可以先把读出的数据放在缓冲期,再从缓冲区读取,等到缓冲区的数据全部读取完成后,再去磁盘读,这样可以解放CPU。缓冲区溢出:缓冲区溢出对于程序来说是个重大bug,一般遇到这种问题会导致程序运行失败,活着设备重启,之前测试中也经常遇到,常见会有反复重启的问题。缓冲区溢出在安全上也是个重要漏洞,相当于开后门,攻击者可以通过缓冲区溢出来执行恶意代码,如攻击覆盖了函数返回地址,且有root权限,通过该溢
缓存溢出(Buffer overflow) ,是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满-一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。
 ...
堆栈是一个特定的存储器或寄存器,其本质就是存储数据的内存。在实际应用中,堆栈会用于存储临时变、函数调用、中断切换时保存和恢复现场数据。
如图所示,堆栈就是内存中的某一片区域,每一个堆栈的内存单元都有唯一一个物理地址,且内存单元的大小都统一是4个字节大小。
并不是esp和ebp之间的范围才是堆栈,整个区域都是堆栈,而esp(栈顶)和esp(栈底)的作用只是定位数据的位置。
由于C/C++语言本身没有数组越界检查机制,当向缓冲区里写入的数据超过了为其分配的大小时,就会发生
缓冲区溢出
。
攻击者可以利用
缓冲区溢出
来窜改进程运行时栈,从而改变程序的正常流向。在分析
缓冲区溢出
攻击的
原理
之前,我们先来
复习一下进程在内存中的结构。
进程在内存中的组织形式
Text段主要包含程序代码(一系列可执行的指令),另外还有一些只读的数据。通常操作系统标记该段为只读段,
如果有进程试图修改该段,会引发段错误。
Data段包括已初始化和未初始化的全局变量,静态变量也放于...
以下两种方法均是编译器采取的关于
缓冲区溢出
的对策
Stackshield
主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断
缓冲区溢出
是否发生。
StackGuard
在返回地址和缓冲区之间添加一段guard区,该guard区中可以由编译器存放一些不可预测的值,利用该guard区的值是否被篡改...