3.10.1 理解指针
- 指针是C语言的一个核心特色,它提供了一种统一方式,对不同数据结构中的元素产生引用。
- 每个指针都对应一个类型,void *类型代表通用指针,它通过强制或隐式类型转换变成一个有类型的指针。
- 每个指针都有一个值,NULL(0)值表示指针没有指向任何地方。
- 指针用&操作符创建。
- *操作符用于间接引用指针。
- 数组与指针紧密联系。
- 将指针从一种类型强制转换为另一种类型,只改变它的类型而不改变它的值,效果只是改变指针运算的伸缩。
- 指针也可以指向函数。
3.10.2 应用:使用GDB调试器
- 程序在执行过程中遇到一个断点时,会停下来,并将控制权返回给用户。
- GDB提供了许多用来调试的命令。
3.10.3 内存越界引用和缓存区溢出
- C对数组没有越界检查,并且局部变量和一些状态信息都存储在栈中,那么对数组的越界写操作会破坏栈信息,能导致非常严重的程序错误。
- 一种特别常见的状态破坏称为缓存区溢出。比如越界导致覆盖了过程调用返回地址。
- 缓存区溢出的一个更加致命的使用就是使程序执行了它不该执行的函数,这是一个最常见的通过计算机网络攻击计算机的方法。
3.10.4 对抗缓冲区溢出攻击
- 栈随机化。思想是使栈的位置在每次程序运行时都有变化。方法是在程序开始运行时,在栈上分配一段0-n字节的空间,程序不使用这段空间。
- 栈破坏检测。思想是在栈帧中任何局部缓冲区和栈状态之间存储一个特殊的金丝雀值,也称为哨兵值。
- 限制可执行代码区域。一种方法是限制哪些内存区域能够存放可执行代码。通过读、写、执行控制位标识,操作系统和硬件层都有已实现技术。
3.10.5 支持变长栈帧
使用%rbp作为帧指针,也称为基指针。
网友评论