2016-04-24 6 views
0

IPパケットを偽造するためにrawソケットを使用すると、IPパケットの実際のサイズを考慮せずに、その全長に対して任意の値を設定できるようです。IPパケットの全長に任意の値を設定できますか?

しかし、パケットを捕まえるためにWiresharkを使用すると、トータルの長さが実際のサイズに補正されています。これは私を本当に混乱させた。

誰かがこの問題について説明できますか?私はあなたの助けに非常に感謝します。

ありがとうございました。

+0

OSまたはネットワークインターフェイスドライバによって上書きされた可能性があります。どこでそれをキャプチャしていますか? – Malt

+0

パケットを送信するソースデバイスであるeth0でキャプチャします。 Diego Pinoは、この問題が 'sendto'関数によって引き起こされたと指摘しました。私が設定した全長は、それによって上書きされました。私がそれを理解するのを手伝ってくれてありがとう、ありがとう。 –

答えて

0

実際のサイズより大きなパケットを送信する場合、ペイロード内の追加データはゼロのチャンクです。理論的には、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パラメータは、変更されていません。

これは私の疑惑ですが、コードを確認することなく伝えるのは難しいです。

+0

それは問題がどこにあるのか正確です!どうもありがとうございます!!また、イーサネットフレームの長さの最大値である1500バイトを超える長さを設定すると、 'sendto'関数は' Message too long'というエラーメッセージを返します。 –

+1

@ZhihongDengそれが今働いているとうれしいです。あなたは私の答えを受け入れるようにマークしてください。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

関連する問題