1. 栈随机化:在栈的起始位置,空置随机大小的空间,程序不使用这段空间(0~n字节),但是它会导致程序每次执行时,后续栈帧的位置发生变化。n必须足够大,来防止被破解,但又必须足够小,不至于浪费空间
2. 栈破坏检测:在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的值,是在程序每次运行时随机产生的。在恢复寄存器状态和从函数返回之前,程序检查这个值是否被更改,如果更改,则异常终止
3. 限制可执行代码区域:限制哪些内存区域能够存放可执行代码。比如三种典型的控制访问形式:读、写、和执行
可变长栈帧的管理:当需要在栈上动态分配存储空间的时候,就要用到rbp了,这样的函数汇编之后的结果常常为:
-
pushq %rbp/*保存rbp原来的值*/
-
mov %rsp, %rbp /*保存当前函数的栈的基地址*/
-
...
-
leave /*等同于
-
mov %rbp, %rsp
-
pop %rbp*/
-
ret
阅读(8856) | 评论(0) | 转发(0) |