
デフォルトで使用されるシェルコードは FreeBSD/x86-64 - execve - 28 bytes from Gitsnik です。変更して、自分用のものを起動用に設定してください。
ping ユーティリティは、ホストまたはゲートウェイから ICMP ECHO_RESPONSE を要求するために使用され、ICMP プロトコルの必須の ECHO_REQUEST データグラムを介して、IPv4 ターゲット(IPv4-host または IPv4-mcast-group)で呼び出されます。ECHO_REQUEST データグラムは、IP ヘッダーと ICMP ヘッダー、その後に "struct timeval" とパケットを埋めるための可変長の "パッド" バイトで構成されます。
FreeBSD プロジェクトのセキュリティアドバイザリによると、ping ユーティリティはネットワークから生の IP パケットを取得し、pr_pack() 関数内で応答を処理します。応答処理では、ping は IP ヘッダー、ICMP ヘッダー、および存在する場合は ICMP エラーを引き起こしたパケットを表す "引用パケット" を再構築します。引用パケットにも IP ヘッダーと ICMP ヘッダーが含まれます。
pr_pack() 関数は、受信した IP ヘッダーと ICMP ヘッダーをスタックバッファにコピーしてさらに処理します。しかし、応答または引用パケット内で 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." のような文字列形式で stdout に出力します。

上図に示すように、ICMP パケットはリクエストと応答の両方で、オプションの Options フィールドを持つ IP ヘッダーで構成されます。悪意のある攻撃では、これらの IP オプションが有効になり、非 null バイトで埋められます。
ICMP パケットが不正な形式であるか、宛先ホストへの経路で意図的に改ざんされ、元のエコー要求で IP オプションが有効になっている場合、pr_pack() 関数は IP オプションの存在に対応するためにスタック上に十分なスペースを割り当てることができず、スタックオーバーフローが発生します。
これらのエラーケースでは、宛先ホストからの応答にも、ICMP エラーを引き起こした特定のパケットを特定する "引用パケット" がデータセクションに含まれる場合があります。pr_pack() 関数は、引用パケットに ICMP ヘッダーが含まれている場合にスタックをオーバーフローさせます。