보안 / AI / 프로그래밍

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

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

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

DevKTW 2021. 2. 5. 00:41

[0x432] IP HEADER CheckSum 구하기

- CheckSum 은 패킷이 잘 도착했는지 오류를 검출하기 위해서 존재한다고 했었는데,

  그 오류 검출 하는 방법에 대해서 배워보겠습니다.

- 일단 WireShark 라는 패킷 캡처 프로그램을 이용해서 아무 패킷이나 잡아봤습니다.

 

WireShark를 통한 Packet 캡쳐한 모습, 맨 아래 표시된 바이트가 IP Header 에 해당하는 20 Byte 입니다. (4500 ~ 7d25)
잘 보시면 11, 12 번째 바이트가 Header Checksum 인 것을 확인할 수 있습니다. (32bits = 4byte)(단위 주의)

첫번째 사진 IP HEADER = { 4500 0028 c280 4000 7806 1209 0d6b 2a0e 79a8 7d25 }

- CheckSum 값이 (16진수로) 1209 인 것을 알 수 있습니다.

- 그럼 이제 계산법에 대해서 배워보겠습니다. 계산법은 아래와 같습니다.

1. Word 단위로 자릅니다.
2. 자른 Word 단위의 값들을 일단 다 더해줍니다. ( Carry 발생은 마지막에 처리 )( Carry 발생 = 자리 올림 현상 )
   여기서 더할때 CheckSum 값은 빼고 더하셔야 합니다.
3. Carry 된 값을 앞에서 때서 더해줍니다.

4-1. 완성된 값을 1의 보수를 취하면 CheckSum 값이 나오는지 확인합니다.
4-2. 혹은 완성된 값에 CheckSum 값을 더하면 FFFF 가 나오는지 확인합니다.
        ( = 애초에 2번 과정에서 CheckSum 포함해서 다 더합니다. )

- 자 그럼 실제로 한번 해보겠습니다.

CheckSum 값인 1209를 빼고 모두 더했더니 2가 Carry 되었음. > Carry 된 2를 EDF4 에 다시 더해줌. 4-2 방법 : CheckSum을 마지막에 더해줌

- 4-1 방법으로 한다면, Binary 값이 1110 1101 1111 0110 이니, 1의 보수를 취하면 0001 0010 0000 1001 이 됩니다.

  0001 0010 0000 1001 값은 16진수로 1209로, CheckSum의 값과 동일한 것을 볼 수 있습니다.

 

- 4-2 방법으로 한다면, 2번째 결과에서 1의 보수를 취해서 대조하는 방식이 아닌, 애초에 CheckSum을 포함해서 더한 후, 이를 1의 보수를 취하면 0000이 되는데, 이는 오류가 없음을 의미합니다.

 

- 4-1과 4-2는 사실 동일한 방법이나, 실용적으로, 확인해야 한다면 4-2 방법이 더 편한 것 같습니다.

 

When verifying a checksum, the same procedure is used as above, except that the original header checksum is not omitted.
=> CheckSum을 검증할 때, CheckSum이 생략되지 않고, 위와 같은 방식이 사용된다.

Taking the ones' complement (flipping every bit) yields 0000, which indicates that no error is detected.
=> 1의 보수를 취하면 (모든 비트를 뒤집으면) 0000 이란 값을 내놓는데, 이는 오류가 없음을 나타낸다.

( 출처 : WikiPedia : IPv4 header checksum )

참조자료

en.wikipedia.org/wiki/IPv4_header_checksum

ryufree.tistory.com/78

Comments