본문 바로가기
프로그래밍/NETWORK HACKING

[네트워크 보안] 파이썬3 struct 모듈을 이용한 패킷 분석

by B T Y 2017. 6. 17.
반응형

파이썬3 struct 모듈을 이용한 패킷 분석에 대해서 정

 

 

str
  - 문자 표현시 사용 가능한 자료형

 

bytes
  - 변경불가
  - 문자에 대한 아스키 코드 표현

 

bytearray
  - 변경가능


  * 네트워크 통신을 할때는 bytes형을 이용해서 통신을 한다.

 

 

1. 네트워크 스트림(장치)으로 부터 읽어들일 때

  - bytes -> 정수, 문자열 형태로 변환


2. 네트워크 스트림으로 내보낼 때

  - 정수, 문자열 -> bytes


  * 숫자 타입 같은 경우에는 struct 모듈을 이용해서 pack, unpack
    ( b'10' 불가능 )


  byte order -> 배치 순서

 

ABCD -> 메모리 저장 -> DCBA   (little endian)

          -> 네트워크 스트림 ->      (big endian)

 

 

 

( int 같은 숫자 자료형은 encode()나 decode() 속성을 가지고 있지 않기 때문에 불가능하기 때문에

파이썬에서 제공하는 struct라는 모듈을 이용해줘야 한다 )

 

 

( struct.pack()을 이용해서 bytes형태로 변환하거나 bytes형태를 struct.unpack을 이용해서 튜플 형태로 내용을

반환해줄수 있다 )



  - 파이썬에서 struct 모듈을 이용한 패킷 분석

<분석 패킷>
data:  b"\x00PV;%\xf8\x00\x05f#0\x19\x08\x00E\x00\x00!\x00\x00@\x00?\x11\xb7\xa9\xc0\xa8\x00\xba\xc0\xa8\x02\x18\x81\x07'\x10\x00\r\x8f\xc7hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

 

 

( 이전에 sniffer.py를 이용해서 얻은 패킷을 packet 변수에 넣고 패킷 분석을 하기 위해

먼저 이더넷헤더 / 아이피헤더 / UDP헤더 / 데이터로 나눠서 각 변수에 저장시키고 확인 해보면

bytes 형태의 내용으로 저장이 된걸 확인 할 수 있다 )

 

 

( struct 모듈을 이용해서 unpack 시키면 bytes 형태를 튜플로 반환해주는데 pack과 unpack을 이용할때

주의할점은 pack / unpack 하려는 내용의 바이트와 앞쪽에 포맷 문자열로 나타낸 바이트가 서로 일치해야 변환이 된다 )

 

* 포맷 문자열 앞에 !는 네트워크는 big-endian이라는 byte order(배치 순서)를 사용하기 때문에 적어준다.

( 참고로 시스템은 little-endian을 사용하고 네트워크는 big-endian을 사용한다 )

 

 

( 이더넷 헤더를 unpack 시킨후에 변수를 이용해 도착지 MAC 주소 / 출발지 MAC 주소 / 이더넷 타입으로

나눠 볼수 있고 포맷 스트링을 이용하면 좀더 모양을 보기 좋게 정리할 수 있다 )

 

* 포맷 스트링으로 도착지 MAC주소를 좀더 보기 좋게 표현 해보려면 '%x:%x:%x:%x:%x:%x' % dst

같은 방식으로 하게 되면 0:80:86:59:37:248 형태로 나타나게 된다.

 

 

  * ip 헤더에서 첫번째 필드 ver & len 필드 같은 경우 나눠주려면 쉬프트 연산과 비트마스킹을 적절하게 이용해야한다.

반응형

댓글