第三章 程序的转换及机器级表示

一、C语言程序的机器级表示

函数P调用函数Q过程执行步骤:

  1. P将入口参数(实参)存到Q能访问的地方(栈)
  2. P保存返回地址(下一条指令的位置),将控制权交给Q
  3. Q保存P的现场(寄存器的内容),为自己分配空间
  4. Q执行自己的函数
  5. Q恢复P的现场,释放自己的空间
  6. Q取出返回地址,返回P

二、栈、栈帧结构 + 缓冲区溢出攻击

       缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或者操作系统定义好。

  • 采用小端存储,栈帧中的数组从低地址处向上填充数据
  • 虚拟地址空间中栈向下生长(从高地址向低地址生长)
  • 当前栈帧底部的上方紧跟着存放了调用者的返回地址(即在当前函数调用结束,当前栈帧空间被释放后,接着执行的地址)

       若当前栈帧的数组溢出(数据长度超过定义的范围),进一步填充至调用者的返回地址。
       此时若再将希望跳转到的函数地址同样按照小端存储的方式写入溢出的数组,调用者的原返回地址会被修改。
       在当前栈帧空间释放回到调用者的返回地址处时,程序会跳转至修改后的地址,而不是原返回地址,完成了缓冲区溢出攻击。

                            在这里插入图片描述
                            图1 虚拟地址空间(stack部分为栈)
在这里插入图片描述
                                          图2 栈帧生长结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值