FreeBSD libnet_pblock_find() problem

Victor Lima <[email protected]> Mon, 28 Feb 2005 23:30:12 -0300 (BRT)
Newsgroups gmane.comp.security.libnet
Message-ID <[email protected]>
Hello list,

    Im trying to build an application that will forge UDP packets based on
 information retrieved by libpcap. The box that I'm using is a FreeBSD
 5.3-REL with ports retrieved from the instalation CD. The libnet version
 is: libnet-devel-1.1.2.1.

 The problem lies somewhere in this code ( or maybe its a bug in libnet
 itself ) :

 -----------------------

void
echo_server ( const unsigned char *packet ) {
 int                    c;
 char                   errbuf[LIBNET_ERRBUF_SIZE], src[15], dst[15],
                        *payload = NULL;
 libnet_t               *lnet;
 libnet_ptag_t          udp, ip;
 struct ip              *ip_hdr;
 struct udphdr          *udp_hdr;

        ip_hdr  = ( struct ip *) ( packet + size_eth );
        udp_hdr = ( struct udphdr *) ( packet + size_eth + size_ip );
        payload = ( char *) ( packet + size_eth + size_ip + size_udp );

        /* the code break somewhere here... */
        if( (lnet = libnet_init( LIBNET_RAW4, NULL, errbuf )) == NULL ) {
                fprintf( stderr, "%s: libnet_init() failed: %s\n", prefix,
                                  errbuf);
                exit( EXIT_FAILURE );
        }

        udp = libnet_build_udp( ntohs( udp_hdr->uh_dport ),
                                ntohs( udp_hdr->uh_sport ),
                                LIBNET_UDP_H + strlen( payload ),
                                0,
                                payload,
                                strlen(payload),
                                lnet,
                                udp );

        if( udp == -1 ) {
              fprintf (stderr, "%s: libnet_build_udp() failed: %s\n",
                                prefix, libnet_geterror(lnet));
                goto bad;
        }
        /* to here */

        ip = libnet_build_ipv4( LIBNET_IPV4_H + LIBNET_UDP_H +
                                strlen( payload ), 0,
                                ip_hdr->ip_id,
                                0,
                                64,
                                IPPROTO_UDP,
                                0,
                                libnet_name2addr4(lnet, (char *)
inet_ntop(AF_INET, &ip_hdr->ip_dst, dst, sizeof(dst)), LIBNET_RESOLVE),
                                libnet_name2addr4(lnet, (char *)
inet_ntop(AF_INET, &ip_hdr->ip_src, src, sizeof(src)), LIBNET_RESOLVE),
                                NULL,
                                0,
                                lnet,
                                ip );
        if ( ip == -1 ) {
                fprintf( stderr, "%s: libnet_build_ipv4() failed: %s\n",
                                 prefix, libnet_geterror(lnet));
                goto bad;
        }
        if( (c = libnet_write(lnet)) == -1 ) {
            fprintf(stderr, "%s: libnet_write() failed: %s\n", prefix,
                            libnet_geterror(lnet));
            goto bad;
        }
        return;
bad:
        libnet_destroy( lnet );
        exit( EXIT_FAILURE );
}

-----------------------

        Whenever I run it, it first blocks on libpcap listening for
 packets, after it recieves one it sends the packet to echo_server, where
 the appropriate headers are pointed to the correct places in the packet,
 so that I can build a response based on the received information. The
 code compiles with no problem except that when I run it, libnet_build_udp
 returns -1 and the following error message appears:

---
libnet_pblock_find() - couldn't find protocol block
---
         Ive googled a bit, and found a few misleading answers none that
 solved my problem, so I came here. Hope you guys can help me...

 thanks in advance,

-- 
Victor Lima