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