[원본 패킷]
Total Length: 4000, ID: 100, MF: 0, Offset: 0
[첫 번째 조각 (Fragment 1)]
1480바이트의 데이터를 담아 전송합니다. 뒤에 조각이 더 남았으므로 MF를 1로 설정합니다.
헤더 포함 전체 길이는 1500바이트입니다.
Total Length: 1500, ID: 100, MF: 1, Offset: 0
[두 번째 조각 (Fragment 2)]
다음 1480바이트의 데이터를 보냅니다. 여전히 남은 조각이 있으므로 MF는 1입니다.
앞서 1480바이트를 보냈으므로 오프셋은 1480(실제로는 8로 나눈 185)이 됩니다.
Total Length: 1500, ID: 100, MF: 1, Offset: 185
[세 번째 조각 (마지막 조각)]
남은 1040바이트의 데이터를 보냅니다. 마지막 조각이므로 MF는 0이 됩니다.
앞서 총 2960바이트를 보냈으므로 오프셋은 2960(실제로는 8로 나눈 370)이 됩니다.
Total Length: 1060, ID: 100, MF: 0, Offset: 370
원리를 이해하기 위해 공격 패킷이 어떻게 구성되는지 파이썬 슈도(Pseudo) 코드로 확인해 보겠습니다.
ping_of_death_concept.py
# [주의] 이 코드는 이해를 돕기 위한 가상 코드입니다.import network_library as nettarget_ip = "192.168.0.100" # 1. 65535바이트를 초과하는 악의적인 거대 데이터를 생성합니다.malicious_payload = "A" * 70000 # 2. 이 데이터를 작은 조각(Fragment)으로 나눕니다.fragments = net.fragment_data(malicious_payload, mtu=1500) # 3. 조각들을 타겟에게 연속적으로 전송합니다.for frag in fragments: # 타겟 시스템은 조각을 받을 때마다 메모리에 누적하다가, # 결국 버퍼를 초과하여 시스템이 멈추게 됩니다. net.send_packet(target_ip, frag)