2013년 4월 24일 수요일

[wireshark] .PCAP 파일 포맷(File Format)


패킷 캡쳐시 리눅스 상에서는 Libpcap, 윈도우 상에서는 Winpcap 라이브러리를 사용하여 패킷을 수집할 경우, 확장자가 .PCAP이라는 파일 포맷(File Format)으로 처리된다.

그렇다면 .PCAP이라는 파일 포맷(File Format)은 어떤 모습일까??

아래의 그림과 같이 가장 처음으로 Global Header란 필드(Field)와 그 다음으로 Packet Header와 Packet Data란 필드(Field)가 한 쌍을 이루어 계속해서 나타나는 모습을 띄고 있다.


Global Header
Packet Header
Packet Data
Packet Header
Packet Data
Packet Header
Packet Data


그럼, 여기서 Global Header와 Packet Header, Packet Data란 무엇을 뜻하는 건지 알아보자.

========================================================

Global Header

typedef struct pcap_hdr_s {
        guint32 magic_number;   /* magic number */
        guint16 version_major;  /* major version number */
        guint16 version_minor;  /* minor version number */
        gint32  thiszone;       /* GMT to local correction */
        guint32 sigfigs;        /* accuracy of timestamps */
        guint32 snaplen;        /* max length of captured packets, in octets */
        guint32 network;        /* data link type */
} pcap_hdr_t;
Global Header는 libpcap file이라는 것을 나타내는 헤더이다. 
실제로 wireshark나 기타 프로그램에서 packet capture를 실행하여 실제로 패킷을 캡쳐한 후 확장자를 .pcap으로 저장하였을 경우 캡쳐한 패킷의 가장 처음 부분에 붙여지는 패킷 캡쳐시의 전체적인 정보이다.

Global Header의 전체 크기는 192bit, 즉 24byte이다.

Record (Packet) Header

typedef struct pcaprec_hdr_s {
        guint32 ts_sec;         /* timestamp seconds */
        guint32 ts_usec;        /* timestamp microseconds */
        guint32 incl_len;       /* number of octets of packet saved in file */
        guint32 orig_len;       /* actual length of packet */
} pcaprec_hdr_t;
Record (Packet) Header는 해당 패킷을 캡쳐했을 당시의 시간과 패킷 길이에 관한 정보로 이루어져 있다.

Record (Packet) Header의 전체 크기는 128bit, 즉 16byte이다.

============================================================================


Q_01. 그럼 Global Header와 Packet Header가 .pcap 파일의 가장 처음에 나오는 값들이라면 
          실제로 캡쳐한 최초 패킷의 데이터는 패킷의 어느위치에서부터 나오는 것인가?

Global Header와 Reacore (Packet) Header의 뒤를 이어 실제 캡쳐한 패킷에 대한 정보가 나오므로, 최초의 패킷 데이터는 Global Header + Packet Header의 크기만큼 이후부터 나오게 된다.
이후 Packet Data의 정보가 끝나면 그 다음 Packet Data에 대한 Packet Header가 새로 추가되어 하나의 쌍을 이루는 형태를 이루게 된다.



Global Header
Packet Header
Packet Data
Packet Header
Packet Data
Packet Header
Packet Data
...
 ----------------------------------------
 |       24byte      |      16byte       |      Packet Data 
 ----------------------------------------           = 실제 캡쳐한 패킷 정보
 | Global Header + Packet Header         (Ethernet 환경에서 캡쳐된 패킷이 대부분이기에 
 |                      => 40byte          |       Ethernet Protocol 정보로 시작된다고 보면 된다)



보통 우리가 쓰는 Internet 환경에서는 DataLink Layer Protocol을 Ethernet Protocol을 쓰기 때문에 Packet Header 부분 뒤에 나오는 Packet Data의 시작 부분에서는 Destination Hardware Address, 즉 목적지 맥주소가 나오게 된다.




실제로 .pcap 확장자로 저장한 캡쳐한 패킷 정보를 HxD 라는 헥사 에디터로 분석할 시 보여지는 16진수형 데이터들이다. 좌측에는 16진수 형태로, 그리고 우측에는 16진수에 해당하는 ASCII Code로 처리되어 보여지게 된다.

좌측에 보여지는 파란색으로 드래그 된 값들이 실제로 16진수로 표현된 Global Header와 최초로 캡쳐된 패킷과 쌍을 이루는 최초 패킷의 Packet Header에 대한 정보이다.

이후 나오는 값인 00 00 C0 9F A0 97 부터는 실제로 캡쳐된 패킷에 대한 정보들에 대한 값이다.


============================================================================

          2) 도서 : SECURITY 네트워크 패킷 포렌식 (최경철 지음, SECU BOOK)

============================================================================





댓글 없음:

댓글 쓰기

spring에서 mariadb로 연동후 웹에서 접근시 jdbc 오류가 발생할때

* 본문은 [코드로 배우는 스프링 웹 프로젝트, 구멍가게 코딩단 지음] 도서를 공부하면서 정리한 글임을 밝힙니다.