IPパケットを偽造するためにrawソケットを使用すると、IPパケットの実際のサイズを考慮せずに、その全長に対して任意の値を設定できるようです。IPパケットの全長に任意の値を設定できますか?
しかし、パケットを捕まえるためにWiresharkを使用すると、トータルの長さが実際のサイズに補正されています。これは私を本当に混乱させた。
誰かがこの問題について説明できますか?私はあなたの助けに非常に感謝します。
ありがとうございました。
IPパケットを偽造するためにrawソケットを使用すると、IPパケットの実際のサイズを考慮せずに、その全長に対して任意の値を設定できるようです。IPパケットの全長に任意の値を設定できますか?
しかし、パケットを捕まえるためにWiresharkを使用すると、トータルの長さが実際のサイズに補正されています。これは私を本当に混乱させた。
誰かがこの問題について説明できますか?私はあなたの助けに非常に感謝します。
ありがとうございました。
実際のサイズより大きなパケットを送信する場合、ペイロード内の追加データはゼロのチャンクです。理論的には、Wireshark(またはtcpdump)で検査するときに、この種のキャプチャされたパケットを見るべきです。たとえば:
IP 192.168.0.3.17664 > 178.60.128.48.1: tcp 32
0x0000: 4500 0064 f0d0 4000 4006 56ab c0a8 0003 [email protected]@.V.....
0x0010: b23c 8030 4500 0001 0000 0000 ff06 dbe4 .<.0E...........
0x0020: c0a8 0003 b23c 8030 04d2 0050 0000 0000 .....<.0...P....
0x0030: 0000 0000 5002 16d0 b3c4 0000 4142 4344 ....P.......ABCD
0x0040: 4546 4748 494a 4b4c 4d4e 4f50 5152 5354 EFGHIJKLMNOPQRST
0x0050: 5556 5758 595a 0000 0000 0000 0000 0000 UVWXYZ..........
0x0060: 0000 0000 ....
これはgoogle.com(178.60.128.48)へのTCPパケットです。ペイロードは "ABC ... XYZ"ですが、IPのtotal_length
は手動で増加しました。その結果、パケットの全長が完成するまで、ペイロードのゼロ埋めが行われます。
私の賭けは、問題がsendto
システムコールにあるということです。これは実際にソケット上でパケットを送信する呼び出しです。しかし、この呼び出しはパケットのtotal_length
も設定します。
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
私はあなたがIPv4ヘッダにパケットのtotal_length
フィールドを微調整している疑いがあるが、送信されたときに、パケットの全体の長さが元の大きさに上書きされるようにsendto
コールのlen
パラメータは、変更されていません。
これは私の疑惑ですが、コードを確認することなく伝えるのは難しいです。
それは問題がどこにあるのか正確です!どうもありがとうございます!!また、イーサネットフレームの長さの最大値である1500バイトを超える長さを設定すると、 'sendto'関数は' Message too long'というエラーメッセージを返します。 –
@ZhihongDengそれが今働いているとうれしいです。あなたは私の答えを受け入れるようにマークしてください。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –
OSまたはネットワークインターフェイスドライバによって上書きされた可能性があります。どこでそれをキャプチャしていますか? – Malt
パケットを送信するソースデバイスであるeth0でキャプチャします。 Diego Pinoは、この問題が 'sendto'関数によって引き起こされたと指摘しました。私が設定した全長は、それによって上書きされました。私がそれを理解するのを手伝ってくれてありがとう、ありがとう。 –