1#!/usr/local/bin/python2.7 2# old fragment completely overlaps new one 3 4# |------------| 5# |XXXX| 6# |----| 7 8# If the current fragment is completely overlapped by existing ones, 9# drop the newer fragment. 10# if (precut >= frent->fe_len) 11# goto bad_fragment; 12# 'Nearer' traffic wins. 13 14import os 15import threading 16from addr import * 17from scapy.all import * 18 19class Sniff1(threading.Thread): 20 filter = None 21 captured = None 22 packet = None 23 def run(self): 24 self.captured = sniff(iface=SRC_IF, filter=self.filter, 25 count=1, timeout=3) 26 if self.captured: 27 self.packet = self.captured[0] 28 29dstaddr=sys.argv[1] 30pid=os.getpid() & 0xffff 31payload="ABCDEFGHIJKLOMNOQRSTUVWX" 32dummy="01234567" 33packet=IP(src=SRC_OUT, dst=dstaddr)/ICMP(id=pid)/payload 34frag0=str(packet)[20:28] 35frag1=dummy 36frag2=str(packet)[28:52] 37pkt0=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=pid, frag=0, flags='MF')/frag0 38pkt1=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=pid, frag=2, flags='MF')/frag1 39pkt2=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=pid, frag=1)/frag2 40eth=[] 41eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt2) 42eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1) 43eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0) 44 45sniffer = Sniff1(); 46sniffer.filter = "ip and src %s and dst %s and icmp" % (dstaddr, SRC_OUT) 47sniffer.start() 48sendp(eth, iface=SRC_IF) 49sniffer.join(timeout=5) 50a = sniffer.packet 51 52if a and a.type == ETH_P_IP and \ 53 a.payload.proto == 1 and \ 54 a.payload.frag == 0 and a.payload.flags == 0 and \ 55 icmptypes[a.payload.payload.type] == 'echo-reply': 56 id=a.payload.payload.id 57 print "id=%#x" % (id) 58 if id != pid: 59 print "WRONG ECHO REPLY ID" 60 exit(2) 61 load=a.payload.payload.payload.load 62 print "payload=%s" % (load) 63 if load == payload: 64 exit(0) 65 print "PAYLOAD!=%s" % (payload) 66 exit(1) 67print "NO ECHO REPLY" 68exit(2) 69