SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

内存漏洞

2.1 - 2.5 是内存使用相关错误
2.6 是通过工具检测、清除错误

内存相关错误:

  1. 内存泄漏
  2. 覆盖内存
  3. 滥用悬挂/野生指针
    Dangle pointer, 指包含了已经消亡的局部变量地址,或已经释放的堆地址
    Wild pointer,指未初始化的指针,这时其初始值可能是任何不可测的值

复习指针

指针算术运算:是以该指针元素为单位
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug
结构体的指针使用‘—>’指向结构体的元素
而结构体变量使用. 运算

1. 错误引用

(1)“野指针”

“野指针”不是NULL指针,是指向“垃圾”内存的指针。
“野指针”是很危险的,因为if语句对它不起作用。

“野指针”的成因主要有两种:
(1)指针变量没有被赋值就使用。
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
(3)指针操作超越了变量的作用范围。

例一:

使用自定义函数分配内存
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

例二:

因为pointer 指向内存free之后,pointer没有置为NULL
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

(2)引用不存在的变量

当函数返回时局部变量消失
不要用return语句返回指向“栈内存”的指针

SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

(3)取消引用错误指针

请注意,scanf中,您应该提供地址,而不是变量,使用&i;而不是i

2. Overwriting Memory 覆盖内存

(1)off-by-one error

数组下标是从 0 ~ array_size -1

(2)buffer overruns 缓冲区溢出

写出去啦!!
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

(3)运算符优先级

* a --:指针递减
* (a)–:值的递减

3. 两次FREE

4. 内存泄漏(缓慢、长期的内存杀手)

当不再需要内存块时,释放内存块失败通常称为内存泄漏
内存泄漏是由于错误或异常返回而发生的,这些返回会跳过旨在释放内存的代码。
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug

结果:使用时间较长的内存不会返回到内存池。最终系统将耗尽内存。而操作系统和 Web 服务器是运行很长时间的程序的示例,并且必须在内存空闲时释放内存。
SLP(Chapter 6):内存布局和分配(part 2)内存漏洞 memory bug


消灭内存错误

内存相关错误:

  1. 内存泄漏
  2. 覆盖内存
  3. 滥用悬挂/野生指针
    Dangle pointer, 指包含了已经消亡的局部变量地址,或已经释放的堆地址
    Wild pointer,指未初始化的指针,这时其初始值可能是任何不可测的值