반응형

 

  • Wireshark IP header flags 16진수 값의 정체

Wireshark는 아래의 이미지와 같이 패킷을 16진수로 표시하여 보여주게 되는데, IP Header를 자세히 분석해보면 한가지 의문점이 생깁니다. 

 

  • "다른 값들은 16진수로 계산하면 맞는데, 왜 flags 값만 계산이 맞지 않을까?"

 

 

Flags의 바로 위에 있는 Identification을 봐도 10진수 64383을 16진수로 변환하면 정확히 0xfb7f 가 나옵니다. 하지만 flags의 경우 0001 0001 0101 1000을 계산해봐도, 0001 0101 1000을 계산해봐도 엉뚱한 값만 나오게 됩니다.

이렇게 값이 나오는 이유를 확인하기 전에 IPv4 Header 구조를 간단히 확인할 필요가 있는데 Flags 필드는 3bit, 그리고 Fragment Offset은 13bit를 사용하고, 와이어샤크에서 출력되는 Flags의 필드는 Flags+Offset 필드를 합친것 이라는 겁니다.

 

 

 

본론으로 들어가 엉뚱한 값이 나오는 이유를 말하자면 위의 이미지의 값인 0x022b 에서 가장 첫번째 숫자(0x0)는 Flags 필드의 값입니다. (모든 Flag가 셋팅되어있지 않기 때문에 0x0이며 만약 MF가 선언되면 0x2가 됩니다.)

  • Q. Flags의 필드값이라면서 MF가 선언되면 왜 0x2인가요? 0x1이여야 하지 않나요?

Flags의 값과 Offset의 값을 따로 계산하기는 하지만 Flags를 2진수로 계산할땐 000 이 아닌, 0000이라는 가정하에 계산 됩니다. 즉 위의 이미지를 예시로 0001의 1은 Offset의 값이며 왼쪽 000이 Flags지만 만약 MF가 선언되면 0011이 되어 Flags의 값은 0x2가 되고, Offset의 값은 계산하지 않습니다.

 

그럼 우선 0x022b 에서 0x0까지는 정체를 알아 냈습니다. 그럼 나머지 22b에 대해 알아봐야 할텐데, 이 값은 Fragment offset의 2진수 값을 16진수로 변환 후 나누기 8을 하면 됩니다.

2진수 : (000)1 0001 0101 1000
10진수로 변환 : 4,440
16진수로 변환 : 1158

16진수 1158 / 8 = 22B

 

이렇게하니 원하는 값인 22B가 나왔습니다. 이런식으로 하지 않고 바로 궁금했던 22B를 곱하기 8로 계산하여 원래의 값을 확인할수도 있습니다.

16진수 22B * 8 = 1158

16진수 : 1158
10진수 : 4,440
2진수 : 0001 0001 0101 1000

 

즉, 와이어샤크는 Flags의 가장 첫번째 숫자는 Flag의 선언 여부에 따라 결정하며 뒤의 3개 숫자는 Offset을 8로 나눈 16진수의 값을 출력 해준다는걸 알 수 있었습니다. 어떤분이 질문을 주신건데, 구글링해도 잘 나오지 않아 혼자 한시간동안 분석 해가며 얻어낸 결과이기 때문에 뿌듯 하네요.

마지막으로 몇개의 예시를 던지고 글 마치겠습니다.

 

 

 

반응형

+ Recent posts