보안 / 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 라는 패킷 캡처 프로그램을 이용해서 아무 패킷이나 잡아봤습니다.
첫번째 사진 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 포함해서 다 더합니다. )
- 자 그럼 실제로 한번 해보겠습니다.
- 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 )
참조자료
'Hacking :: The Art Of Exploitation > 0x400 :: 네트워킹' 카테고리의 다른 글
[0x432-0x433] [보충] TCP HEADER Urgent Pointer (0) | 2021.02.07 |
---|---|
[0x432-0x433] [보충] TCP HEADER Window Size (1) | 2021.02.07 |
[0x433] 전송계층 ( OSI 4계층 ) - TCP (0) | 2021.02.05 |
[0x432] 네트워크 계층 (OSI 3계층) / IP HEADER (0) | 2021.02.03 |
[0x431] 하위 계층 분석 - 데이터 링크 계층(OSI 2 계층) / MAC 주소 / ARP (0) | 2021.02.03 |
Comments