icmp checksum patch (bug found by Niels Provos)
new release not quite ready yet
This commit is contained in:
parent
45480eeb0f
commit
3865cc190e
267
net/nemesis/patches/patch-nemesis-icmp_c
Normal file
267
net/nemesis/patches/patch-nemesis-icmp_c
Normal file
@ -0,0 +1,267 @@
|
||||
--- nemesis-proto_icmp.c.orig Mon Oct 9 18:28:38 2000
|
||||
+++ nemesis-proto_icmp.c Mon Oct 9 18:29:34 2000
|
||||
@@ -70,7 +70,7 @@ buildicmp()
|
||||
0, /* IP payload size */
|
||||
pkt + LIBNET_ETH_H); /* packet header memory */
|
||||
|
||||
- if (type == ICMP_ECHOREPLY) /* type = 0 */
|
||||
+ if (type == ICMP_ECHOREPLY) { /* type = 0 */
|
||||
libnet_build_icmp_echo(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -78,8 +78,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet memory header */
|
||||
-
|
||||
- if (type == ICMP_UNREACH) /* type = 3 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_ECHO_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_UNREACH) { /* type = 3 */
|
||||
libnet_build_icmp_unreach(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
0, /* ICMP original length */
|
||||
@@ -93,8 +96,12 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet memory header */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_UNREACH_H + payload_s);
|
||||
+ }
|
||||
|
||||
- if (type == ICMP_REDIRECT) /* type = 5 */
|
||||
+ if (type == ICMP_REDIRECT) { /* type = 5 */
|
||||
libnet_build_icmp_redirect(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
gwy, /* preferred gateway */
|
||||
@@ -109,8 +116,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_ECHO) /* type = 8 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_REDIRECT_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_ECHO) { /* type = 8 */
|
||||
libnet_build_icmp_echo(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -118,7 +128,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
- if (type == ICMP_TIMXCEED) /* type = 11 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_ECHO_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_TIMXCEED) { /* type = 11 */
|
||||
libnet_build_icmp_timeexceed(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
0, /* ICMP orig length */
|
||||
@@ -132,7 +146,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
- if (type == ICMP_TSTAMP) /* type = 13 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_TIMXCEED_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_TSTAMP) { /* type = 13 */
|
||||
libnet_build_icmp_timestamp(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -143,8 +161,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_TSTAMPREPLY) /* type = 14 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_TS_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_TSTAMPREPLY) { /* type = 14 */
|
||||
libnet_build_icmp_timestamp(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -155,7 +176,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
- if (type == ICMP_MASKREQ) /* type = 17 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_TS_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_MASKREQ) { /* type = 17 */
|
||||
libnet_build_icmp_mask(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -164,7 +189,11 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
- if (type == ICMP_MASKREPLY) /* type = 18 */
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_MASK_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_MASKREPLY) { /* type = 18 */
|
||||
libnet_build_icmp_mask(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -173,10 +202,10 @@ buildicmp()
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
|
||||
-
|
||||
- libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
- libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP, ICMP_S +
|
||||
- payload_s);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
|
||||
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
|
||||
+ LIBNET_ICMP_MASK_H + payload_s);
|
||||
+ }
|
||||
memcpy(ipopt.ipopt_list, options, option_s);
|
||||
*(ipopt.ipopt_list) = IPOPT_SECURITY;
|
||||
*(ipopt.ipopt_list + 1) = 1;
|
||||
@@ -211,16 +240,17 @@ buildicmp()
|
||||
0, /* IP payload size */
|
||||
pkt); /* packet header memory */
|
||||
|
||||
- if (type == ICMP_ECHOREPLY) /* type = 0 */
|
||||
+ if (type == ICMP_ECHOREPLY) { /* type = 0 */
|
||||
libnet_build_icmp_echo(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
seq, /* sequence number */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet memory header */
|
||||
-
|
||||
- if (type == ICMP_UNREACH) /* type = 3 */
|
||||
+ pkt + LIBNET_IP_H); /* packet memory header */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_UNREACH) { /* type = 3 */
|
||||
libnet_build_icmp_unreach(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
0, /* ICMP original length */
|
||||
@@ -233,9 +263,10 @@ buildicmp()
|
||||
source, /* source address */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet memory header */
|
||||
-
|
||||
- if (type == ICMP_REDIRECT) /* type = 5 */
|
||||
+ pkt + LIBNET_IP_H); /* packet memory header */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_UNREACH_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_REDIRECT) { /* type = 5 */
|
||||
libnet_build_icmp_redirect(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
gwy, /* preferred gateway */
|
||||
@@ -249,18 +280,21 @@ buildicmp()
|
||||
source, /* source address */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_ECHO) /* type = 8 */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_REDIRECT_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_ECHO) { /* type = 8 */
|
||||
libnet_build_icmp_echo(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
seq, /* sequence number */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
|
||||
|
||||
- if (type == ICMP_TIMXCEED) /* type = 11 */
|
||||
+ }
|
||||
+ if (type == ICMP_TIMXCEED) { /* type = 11 */
|
||||
libnet_build_icmp_timeexceed(type, /* ICMP type */
|
||||
code, /* ICMP code */
|
||||
0, /* ICMP orig length */
|
||||
@@ -273,9 +307,10 @@ buildicmp()
|
||||
source, /* source address */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_TSTAMP) /* type = 13 */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TIMXCEED_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_TSTAMP) { /* type = 13 */
|
||||
libnet_build_icmp_timestamp(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -285,9 +320,10 @@ buildicmp()
|
||||
0, /* transmit timestamp */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_TSTAMPREPLY) /* type = 14 */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_TSTAMPREPLY) { /* type = 14 */
|
||||
libnet_build_icmp_timestamp(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -297,9 +333,10 @@ buildicmp()
|
||||
ttime, /* transmit timestamp */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_MASKREQ) /* type = 17 */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_MASKREQ) { /* type = 17 */
|
||||
libnet_build_icmp_mask(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -307,9 +344,10 @@ buildicmp()
|
||||
mask, /* address mask */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- if (type == ICMP_MASKREPLY) /* type = 18 */
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
|
||||
+ }
|
||||
+ if (type == ICMP_MASKREPLY) { /* type = 18 */
|
||||
libnet_build_icmp_mask(type, /* ICMP type */
|
||||
0, /* ICMP code */
|
||||
id, /* ICMP id */
|
||||
@@ -317,10 +355,9 @@ buildicmp()
|
||||
mask, /* address mask */
|
||||
payload, /* ICMP payload pointer */
|
||||
payload_s, /* ICMP payload size */
|
||||
- pkt + IP_H); /* packet header memory */
|
||||
-
|
||||
- libnet_do_checksum(pkt, IPPROTO_ICMP, ICMP_H + IP_H + payload_s);
|
||||
-
|
||||
+ pkt + LIBNET_IP_H); /* packet header memory */
|
||||
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
|
||||
+ }
|
||||
memcpy(ipopt.ipopt_list, options, option_s);
|
||||
*(ipopt.ipopt_list) = IPOPT_SECURITY;
|
||||
*(ipopt.ipopt_list + 1) = 1;
|
Loading…
Reference in New Issue
Block a user