## 缓冲区溢出分析方法

缓冲区溢出分析，首先需要从Sink点出发，明确三点:

- 读写内容是否外部可控
- 缓冲区长度 L_buffer
- 允许读写长度 L_allow

缓冲区长度和内容是否为外部可控均可以通过追溯数据流获得结论，下面重点分析如何分析允许读写长度 L_allow

- 首先看Sink点函数是否存在读写长度参数，如果存在，追溯数据流分析参数变量来源，并分析 该参数可能为缓冲区长度 L_buffer 的几倍（未知长度为 N 倍），该参数为 L_allow
- 如果不存在读写长度参数限制，那么实际允许读写长度为 读写内容变量的长度（记为L_content）
  - 接下来需要关注 读写内容长度，首先需要梳理出数据流，找出到达 Sink点 前所有可能限制读写内容长度的代码（注意区分纯使用长度计算的代码和校验限制的代码）
  - 逐个分析每个限制代码限制了 L_content 可能为缓冲区长度 L_buffer 的几倍（未知长度为 N 倍），其中最小的一个记为 L_allow
  - 注意项：计算长度的代码需要考虑 **整数溢出** 问题

最后分析 L_allow 和 L_buffer 的大小，如果存在 L_allow > L_buffer的可能，则存在缓冲区溢出；反之则不存在。

## 分析注意事项

- 某些代码虽然使用了读写内容长度计算，但是没有产生限制效果，需要严格区分
- 最后必须明确列出 L_allow 可能的大小以及和 L_buffer 的对比
- 如果长度限制涉及数学运算（加减乘除等），需要额外考虑 **整数下溢** 问题（因为通常读写长度为无符号整数，负数会被隐式转换为超大正数，导致读写越界）

