## 环境搭建
首先, 创建一个windows虚拟机, 添加两个网卡, 记作net1, net2. 依照 [Enable Internet Connection Sharing (ICS) in Windows 10](https://support.ringcentral.com/article-v2/Enable-Internet-Connection-Sharing-ICS.html?brand=RC_US&product=RingCentral_MVP&language=en_US)启用网络共享.
正常启用后, 观察监听端口, 可以看到多了3个新的监听端口, 分别是53, 67, 68, 都来自同一个进程, 如下所示:
## 补丁分析
对比文件`ipnathlp.dll`文件如下:
可以看到, 在左侧行37位置, 当长度超过0x20时, 它并没有跳转到结束, 而是继续处理, 补丁后, 它直接结束了后续函数操作. 所以问题很明显, 就是在后续的操作中可能存在溢出问题.
这里`a2+228`为data开始位置, buffer空间大小为1500. `a2+220`指示buffer中数据长度.
跟踪了`DhcpExtractOptionsFromMessage`并没有发现问题, 跟踪`DhcpProcessBootpMessage->DhcpAddArpEntry`, 有如下代码:
```
DhcpRemoveArpEntry(a1);
memset_0(&Row, 0, sizeof(Row));
Row.InterfaceIndex = DhcpAdapterIndex;
Row.Address.Ipv4.sin_family = 2;
Row.Address.Ipv4.sin_addr.S_un.S_addr = a1;
Row.PhysicalAddressLength = v4;
memcpy_0(Row.PhysicalAddress, Src, v4);
v10 = CreateIpNetEntry2(&Row);
```
`v4`为`a2+230`的值, 即DHCP协议的Hardware address length 字段, `Row`是栈结构体, 大小为0xa8, 可以看到此处当`v4`超过`0xa8`时, 就会栈溢出.