반응형

오늘은 UDP header 분석을 해보도록 하겠습니다.


오늘 실습환경

server ip=192.168.219.136입니다

client ip=192.168.219.186입니다

* 로우 소켓 프로그래밍


계층 4 -> 3 -> 2 -> 1: 확인분석


1 -> 2 -> 패킷 직접 제작(프로토콜)


* 로우 소켓 프로그래밍: 스니퍼(덤프) 프로그램


  - 무엇을 덤프할 것인가?

  

  - NIC 장치로 들어오거나 나가는 것들(패킷)


* 스니핑(sniffing)


  - 다른 사람의 패킷을 가로채는 기법



code


#>vi sniffer.py

import socket

import struct


raw = socket.socket( socket.PF_PACKET, socket.SOCK_RAW )

   ->리눅스만 지원

raw.bind( ('eth0', socket.SOCK_RAW) ) <- raw소켓은 '장치명', socket.SOCK_RAW


while True:

  data, addr = recvfrom( 65535 )

  print("data:", data)




time.sleep(1)걸어 무차별적으로 나오는 패킷들을 1초마다 보이게 해서 가독성을 높였습니다.


*sniffer.py 실행결과



UDP 통신 배운걸 가지고 sniffing을 해보도록 하겠습니다.


hello 문자열을 echo 통신하는걸 sniffing 했습니다


*server 결과화면



*client 결과화면



*sniffer 결과화면



hello패킷만 확대해보았습니다.




data: 

b"\x00PV/c\x8a\x00\x0c)VZ\x0e\x08\x00<-Ethernet 헤더 14bytes

E\x00\x00!\x00\x00@\x00@\x11\x028\xc0\xa8\xdb\x88\xc0\xa8\xdb\xba<-Ip 헤더 20bytes

'\x10\xe4\x86\x00\rw\xd6<-UDP 헤더 8bytes

hello"<- data부분


오늘은 4계층만 보도록하겠습니다

4계층

  - 데이터의 전송을 담당

  - 어떠한 통신 방식을 사용
  - 누구에게 전달되야 되는지, 누구로부터 전송이 되었는지, ..
  - 프로토콜

  - UDP, TCP

  - 주소체계: 포트(port): 서비스에 대한 식별

  - PDU( Protocol Data Unit ): segment


* UDP( User DataGram Protocol )

  - 신뢰할 수 없는 서비스(인증이 어려움)
  - 빠른 통신이 가능(복잡하지 않다)

  - 소규모 통신에 적합한 방식

* UDP 헤더: UDP로 데이터를 송수신 하기위한 정보

  - 8바이트의 고정 크기

1). 출발지의 포트번호: 2바이트
2). 도착지의 포트번호: 2바이트
3). UDP 세그먼트의 크기: 2바이트( UDP header + data size )
4). 체크섬: 2바이트
  - 에러 체크 기능
  - 모든 경우를 전부 체크할 수 없다, 매우 간편하다
  - 보완:CRC, 패리티 부호, ..



'\x10\xe4\x86\x00\rw\xd6<-UDP 헤더 8bytes


이걸로 분석해보겠습니다


1.출발지 포트번호 2바이트 :'\x10


'을 아스키코드로 찾아보면 16진수로 27이므로 0x2710을 10진수로 바꾸면 10000포트가 나옵니다. 

제가 server포트를 10000포트로 설정했으니 맞는걸 볼수있습니다


2.도착지 포트번호 2바이트 :\xe4\x86

0xe486을 10진수로 바꾸면 58502가 나오므로 client 포트는 랜덤으로 58502로 되었다는걸 알 수 있습니다


3.UDP 세그먼트의 크기 2바이트:\x00\r


\r은 carriage return으로 CR을 아스키코드에서 찾아보면 13이 나오므로 10진수로도 13입니다 UDP고정크기 8바이트에 데이터 hello 5바이트가 추가되어 13바이트인걸 확인할수 있습니다


4.체크섬:w\xd6

UDP 체크섬은 pseudo header가 필요하고 좀 더 공부를 해야 되기떄문에 뒤에서 다루도록 하겠습니다.


읽어주셔서 감사합니다

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기