默认使用的 shellcode 是 FreeBSD/x86-64 - execve - 28 字节(来自 Gitsnik),请替换为你自己的以进行启动
ping 工具用于向主机或网关请求 ICMP ECHO_RESPONSE,它通过 ICMP 协议必须的 ECHO_REQUEST 数据报,以 IPv4 目标(IPv4 主机或 IPv4 多播组)进行调用。ECHO_REQUEST 数据报由 IP 和 ICMP 头组成,随后是一个 "struct timeval" 和数量可变的 "pad" 字节,用于填充数据包。
根据 FreeBSD 项目的安全公告,ping 工具从网络获取原始 IP 数据包,以在 pr_pack() 函数中处理响应。在响应处理过程中,ping 会重建 IP 头、ICMP 头,以及(如果存在)表示导致 ICMP 错误的原始数据包的 "quoted packet"。该 quoted packet 同样包含一个 IP 头和一个 ICMP 头。
pr_pack() 函数会将接收到的 IP 和 ICMP 头复制到栈缓冲区中以供进一步处理。然而,它没有考虑在响应或 quoted packet 中,IP 头之后可能存在 IP 选项头的情况。当存在 IP 选项时,pr_pack() 会使目标缓冲区溢出多达 40 字节。
ping 工具运行在用户空间,当调用 ping 命令时,会执行位于 /sbin/ping 的二进制文件。该工具的源代码可在 FreeBSD 源码中公开获取。存在漏洞的函数 pr_pack() 会将 ICMP 包响应信息以字符串格式打印到标准输出,例如 "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

如上图所示,ICMP 数据包在请求和响应中,都包含带有可选 Options 字段的 IP 头。在恶意攻击中,这些 IP Options 会被启用并填充非空字节。
如果 ICMP 数据包在发往目标主机的途中被破坏或故意篡改,且原始 echo 请求中启用了 IP Options,则 pr_pack() 函数无法在栈上分配足够的空间来容纳 IP Options,从而导致栈溢出。
在这些错误情况下,来自目标主机的响应数据部分也可能包含一个 "quoted packet",用于标识导致 ICMP 错误的特定数据包。当 quoted packet 包含 ICMP 头时,pr_pack() 函数会发生栈溢出。