小菜谈谈之缓冲区溢出

在介绍缓冲区溢出之前先介绍相关概念

一、缓冲区

所谓缓冲区是指内存中存放数据的地方,可以更为抽象地理解为一段可读可写的内存区域。以进程地址空间分布图来说明缓冲区位置,如图1。

 

                    图1 进程地址空间分布

(1)代码段:存储用户程序的所有可执行代码,在程序正常执行的情况下,程序计数器(PC指针)只会在代码段和操作系统地址空间(内核态)内寻址。
(2)数据段:存储用户程序的全局变量(静态数据)、常量等。
(3)堆空间:存储程序运行时动态申请的内存数据等,并在用完之后归还给堆区。动态分配和回收是堆区的特点。堆的数据增长方向是高地址方向。
(4)栈空间:存储用户程序的函数栈帧(包括参数、局部数据等动态数据),实现函数调用机制,以保证调用函数结束后继续执行父函数的指令。栈的数据增长方向是低地址方向。
除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区,因此缓冲区溢出的位置可能在数据段,也可能在堆、栈段。最常见的应该是栈段。

二、寄存器

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。以下介绍缓冲区溢出中用到的寄存器。
(1)esp:栈指针寄存器(extended stack pointer),其内存放着一个指针,指向当前堆栈储存区域的顶部。该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)ebp:基址指针寄存器(extended base pointer),其内存放着一个指针,指向当前堆栈储存区域的底部。该指针永远指向系统栈最上面一个栈帧的底部。(ebp在当前栈帧内位置固定,故函数中对大部分数据的访问都基于ebp进行)
(3)eip:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待执行的指令地址。eip是在缓冲区溢出中对我们最有用的寄存器,可以说如果控制了eip寄存器的内容,就控制了进程——我们让eip指向哪里,CPU就会去执行哪里的指令。eip可被jmp、call和ret等指令隐含地改变(事实上它一直都在改变)(ret指令就是把当前栈顶保存的返回值地址弹到eip中&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值