【读书笔记】CSAPP-深入理解计算机系统

栈保护机制通过在栈帧中插入金丝雀值来检测缓冲区越界,防止栈溢出攻击。在x86-64架构中,由于更严格的对齐要求和寄存器的扩展,处理器对栈的依赖减少,增加了程序安全性。局部变量分配遵循特定规则,确保数据类型对齐。栈保护仅在函数包含char类型缓冲区时启用。
摘要由CSDN通过智能技术生成

栈保护机者(stack protector)机制,用来检测缓冲区越界。

思想:在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀(canary)值(只读),也称之为哨兵值(guard value),是在程序每次运行时随机产生的。在恢复寄存器状态和从函数返回之前,程序检查这个金丝雀值是否被该函数的某个操作或者该函数调用的某个函数的某个操作改变了。

GCC只有函数中有局部char类型缓冲区的时候才插入这样的代码。

movl %gs:20, %eax          Retrieve canary
...
xorl %gs:20, %eax          Compare to stored value

数组是同样大小的块的序列来分配,这些块中保存着这些数组元素;结构则作为变长的块来分配,块中保存着结构元素;联合是作为一个单独的块来分配,这个块足够大,能够装下联合中最大的元素。

x86-64 遵循一组更严格的对齐要求。对于任何需要K字节的标量数据类型来说,它的起始地址必须是K的倍数。

x86-64硬件和编程规则的形成改变了处理器,过去它严重依赖栈来保存程序状态,现在则是将最常使用的状态部分保存在更快并扩展了的寄存器组中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值