파이썬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 필드 같은 경우 나눠주려면 쉬프트 연산과 비트마스킹을 적절하게 이용해야한다.
'프로그래밍 > NETWORK HACKING' 카테고리의 다른 글
[네트워크 보안] 파이썬3 UDP 프로토콜 클래스 정의 및 packet.py / sniffer.py 수정 (0) | 2017.06.21 |
---|---|
[네트워크 보안] 파이썬3 클래스로 각 프로토콜 헤더를 정의( packet.py, eth.py, ip.py, sniffer.py ) (0) | 2017.06.20 |
[네트워크 보안] UDP 통신 계층별 분석 (0) | 2017.06.16 |
[네트워크 보안] 파이썬 TCP 소켓 / TCP 에코 서버 & 클라이언트 (0) | 2017.06.15 |
[네트워크 보안] 파이썬 소켓 통신(UDP) / UDP 에코서버 실습 (0) | 2017.06.13 |
댓글