2010년 9월 18일 토요일

패킷파일이 깨진 경우는 언제? 65535 보다 큰 값의 헤더가 있다면...

capinfo, tshak 등을 실행하다 아래와 같은 에러를 얻은 경우가 있다.

[Error] (pcap: File has 1279743227-byte packet, bigger than maximum of 65535)
[Error] (pcap: File has 1174099712-byte packet, bigger than maximum of 65535)
[Error] (pcap: File has 808345964-byte packet, bigger than maximum of 65535)                        

패킷 사이즈만 보면 엄청난 크기이다. 그런데 잘 생각해 보면 이상하다고 생각되는 부분이 있을 것이다.
아래 관련한 소스를 찾아보면 한번 살펴보자.

wireshark1.2.9/wiretap/libpcap.c 를 한번 들여다 본 것이다.

    if (hdr->hdr.incl_len > WTAP_MAX_PACKET_SIZE) {
        /*
         * Probably a corrupt capture file; return an error,
         * so that our caller doesn't blow up trying to allocate
         * space for an immensely-large packet, and so that
         * the code to try to guess what type of libpcap file
         * this is can tell when it's not the type we're guessing
         * it is.
         */
        *err = WTAP_ERR_BAD_RECORD;
        if (err_info != NULL) {
            *err_info = g_strdup_printf("pcap: File has %u-byte packet, bigger than maximum of %u",
                hdr->hdr.incl_len, WTAP_MAX_PACKET_SIZE);
        }
        return -1;
    }

일단, 위에서 발생한 에러의 문구를 볼 수 있다. hdr->hdr.incl_len 이 WTAP_MAX_PACKET_SIZE 보다 큰 경우에 발생한 것인데 WTAP_MAX_PACKET_SIZE 값 또한 찾아보자.
이 값은 wtap.h 에 아래와 같이 정의되어 있다.

/*
 * Maximum packet size we'll support.
 * It must be at least 65535.
 */
#define WTAP_MAX_PACKET_SIZE            65535

최대 패킷 사이즈라고 정의되어 있다. 즉 헤더의 패킷 사이즈를 생각해보면 2 바이트로 최대 65535 까지
가능한 것이다. 그러므로 이론적으로 이 값을 초과할수는 없는 것이기에 패킷 파일이 깨졌을 가능성이 높은 것이다.

한번 테스트용 파일을 tcpdump 를 통해서 오픈 해 봤다. bogus savefile header 라는 문구가 보인다.

# tcpdump -n -r test.cap | wc -l
reading from file test.cap, link-type EN10MB (Ethernet)
tcpdump: pcap_loop: bogus savefile header
1407

이번에는 tshark 를 통해 파일을 읽어 보겠다.

tshark: "test.cap" appears to be damaged or corrupt.
(pcap: File has 781876-byte packet, bigger than maximum of 65535)

781876 바이트를 가지고 있다고 에러가 발생한다. 그리하여 781876 을 HEX 로 변환하여 해당 값을
찾아보니 나타난다.

# hexdump -C test.cap | grep "34 ee 0b"
00072eb0  34 ee 0b 00 66 00 00 00  66 00 00 00 01 00 5e 00  |4...f...f.....^.|

결국은 헤더파일에 잘못된 값이 들어가 있었기 때문에 발생한 것이다. 이렇게 파일이 깨지는 경우도 있으니, 이와 같은 메시지를 얻는 다면 참고하기 바란다.

댓글 없음:

댓글 쓰기