보안 / AI / 프로그래밍

[0x432-0x433] [보충] TCP HEADER CheckSum 구하기 본문

Hacking :: The Art Of Exploitation/0x400 :: 네트워킹

[0x432-0x433] [보충] TCP HEADER CheckSum 구하기

DevKTW 2021. 2. 12. 21:54

[0x433][보충] TCP HEADER CheckSum 구하기 - Pesudo Header

- TCP Header에 오류가 있는지 없는지 검사하기 위해서는 "Pesudo Header" 를 생성해야 합니다.

  직역하면 가짜 헤더입니다. TCH Header의 오류검사를 위해, 필요에 의해 생성하는 헤더입니다.

 

- Pesudo Header 의 구조는 아래와 같습니다.

TCP Header CheckSum을 위한 Pesudo Header의 내부 구조

ㅇ Source Address ( 32 bits )
  - IP Header의 값을 참조하여 만들어지며, 출발지 IP 주소값을 가집니다.

 

ㅇ Destination Address ( 21 bits )

  - IP Header의 값을 참조하여 만들어지며, 목적지 IP 주소값을 가집니다.

 

ㅇ Reserved ( 8 bits )

  - 말그대로 예약된 필드이며, 항상 0 값을 가집니다.

 

ㅇ Protocol ( 8 bits)

  - IP Header의 값을 참조하여 만들어지며, IP Header의 Protocol 필드값을 가집니다.

 

ㅇ TCP Segment Length ( 16 bits )

  - TCP Header + Data의 총 길이의 값을 가집니다. ( 총 크기 ) ( byte 단위 )

    TCP 의 최대 크기가 65,535 bytes 임을 인지한다면, 왜 필드 크기가 16bits 인지 이해할 수 있습니다.

    ( 그야.. 16bits 면 10진수로 0~65535까지 표현 가능하니까..)

 


[0x433][보충] TCP HEADER CheckSum 구하기 - 계산법

- WireShark 에서 상단 메뉴의 Edit - Preference - Protocol - TCP 에서 [ Validate the TCP checksum if Possible ] 을 체크해줍니다. 제가 처음에는 아무 TCP Packet 이나 잡아서 Checksum 계산을 해보았는데, 아무리봐도 안맞았습니다. 그렇게 삽질끝에, 제 컴퓨터만 그런걸 지도 모르지만, 대부분의 TCP Packet의 Checksum이 맞지 않음을 알았습니다. 그래서 올바를 TCP Packet을 가지고 실제로 계산하려면 알려드린 옵션을 꼭 체크하셔야 합니다.

 

WireShark 에서 TCP Checksum 옵션을 설정하는 모습이다.
WireShark TCP CheckSum 체크시, 올바르지 않은 CheckSum값들이 있는 TCP Packet 들이 검은색으로 체크된 모습이다.

- 또한 TCP Packet들을 잡아내기 위해서 WireShark 필터란에 tcp 를 입력해야합니다.

- 위의 사진에서 많은 TCP Packet들 중 하나를 가져오겠습니다.

파란색은 출발지IP, 빨간색은 목적지IP, 초록색박스는 TCP HEADER + DATA 부분 (= TCP 전체), 보라색은 CheckSum 값이다. 

 

- 일단 위에서 배운 Pesudo Packet을 만들어줍니다. Pesudo Packet 제작에 필요한 IP Header를 참조해줍니다.

  즉 IP Header의 출발지, 목적지 IP 주소, 프로토콜 값을 참조하여 만듭니다.

 

- TCP Header + Data 길이가 총 32 Bytes 이므로, 32는 16진수로 0x20이므로 TCP Segment Length 값에 0x20을 넣습니다.

- TCP Protocol 값은 IP Header에서 참조해야하며, 이는 IP Header의 출발지IP 값 왼쪽 3번째 바이트값입니다.

 

- 다음으로 IP Header CheckSum 계산하는 방법과 동일하게, Pesudo Packet 값을 2 Bytes (Word) 단위로 더해줍니다.

  자리 올림된 숫자는 나중에 더해주셔도 됩니다.

 

Pesudo Packet 내부의 값을 Word 단위로 더한 결과이다. 자리 올림된 숫자는 '2' 이며, 계산 마지막에 더해주었다.

- 같은 방식으로 이번엔 TCP Header + Data 의 값들을 Word 단위로 더해줍니다.

- (1) TCP Header의 CheckSum 값을 제외하고 모두 더하고, 위에서 구한 Pesudo Packet 결과값을 더해서, 마찬가지로 자리 올림 숫자를 처리 후, 1의 보수를 취해서 결과값을 CheckSum 값과 대조해도 되나,

  (2) CheckSum 값을 포함해서 (1)과 같은 방식으로 더한후, 값이 0xFFFF인지 확인하셔도 무방합니다.

 

- 먼저 (1) 방식으로 해보겠습니다.

윈도우 프로그래머 계산기를 사용하면 빨간 박스와 같이, 가볍게 1의 보수를 취할수 있다. CheckSum 값과 동일하게 나온 것도 확인할 수 있다.

 

- 다음은 (2) 방식으로 해보겠습니다.

CheckSum 값을 포함해서 계산하면 굳이 1의 보수를 취하지 않아도 된다.

- 잘 보시면 첫번째 사진에 5B5 (= TCP CheckSum 값)을 포함해서 계산한 것을 볼 수 있습니다.

- IP Header CheckSum 계산 게시글과 마찬가지로, 개인적으로 CheckSum 값을 포함해서 계산하고 0xFFFF 인지 확인하는 게 더 편한 것 같습니다.

Comments