본문 바로가기

Network Hacking

2일차]파이선 환경 구성 및 UDP 통신

1. 리눅스 파이선 설치

#> wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz    // 3.x.x 대 버전 사용 <공식 홈페이지>

 

2. 개발자 도구 설치

#> yum groupinstall "Development Tools"

 

3. 파이선 압축 해제

#> tar xvfz Python-3.6.4.tgz

 

4. 소스코드 빌드

0) #> yum install readline-devel     // 파이선 쉘 내에서 화살표나 방향키 오류 잡는 법.

1) #> cd Python-3.6.4

2) #> ./configure

3) #> make

4) #> make install

 

5. 최종 

#> python3    (파이선 버전 확인)

 

 

파이선 쉘 실행 및 종료

1) 인터프리터 : #>python3

2) #>python3 파이썬소스파일.py

3) #>python3 -i 파이썬소스파일.py     // -i 옵션은 파이선 소스파일 실행 후 해당 쉘 인터프리터가 나온다.

4) 종료 : Ctrl + D or exit()

 


OSI 7Layer에 대한 기본 정보는 http://kimhyun2017.tistory.com/95 에서 확인. 가장먼저 전송 계층부터 시작.!

 

L4: 전송계층 (Transfer)

전송계층은 통신규약인 프로토콜로 TCP와 UDP가 있다. TCP는 전화라고 보면되고 UDP는 문자라고 보면된다.

전화통화는 서로 연결(신뢰성)이 되어야 대화(데이터의 교환)가 가능하다. 하지만 문자는 일단 송신이 되어지고 상대방이 받았는지 안받았는지 확인이 불가(비 신뢴성)하다. 대신에 빠르다는 장점이 있다.

 

이러한 특성을 생각하며 UDP먼저 간단히 메세지만 주고 받는 프로그래밍을 해보자.!

 

먼저, 보내는 사람과 받는 사람이 있어야하기 때문에 서버와 클라이언트가 있어야 한다.

 

SERVER

- 클라이언트로 부터 문자열을 전달 받는다.

- 해당 클라이언트에게 전달 받은 문자열을 그대로 되돌려 준다.

 

아주 간단한 기능을 하는 Server의 코딩 내용을 한줄 한줄 살펴보자.

 

1. 우선 socket과 관련된 함수를 이용하기 위해서는 socket을 imort해주어야 한다.

import socket 

 

2. 소켓을 생성해 준다.

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  // !! ? ?

※ 소켓관련 프로그래밍에서 모두 socket 객체를 이용하기 때문에 socket.을 해주고 있는 것을 확인 할 수 있다.

※ AF_INET은 IPv4 을 이용한다는 뜻이고, SOCK_DGRAM은 UDP방식으로 통신하겠다는 뜻이다.

 

3. 통신을 위해서 bind를 통해 port를 열어준다.

sock.bind( ('192.168.3.120', 22222) )

※ 첫번째 인자는 자신의 ip를 문자열형태로 입력해주고, 두번째 인자는 포트 번호를 입력해주면된다. (임의로 22222로 생성)

 

4. 클라이언트로 부터 문자열을 전달 받기위해 recvfrom을 한다.

data = sock.recvfrom(55555)

※ data는 전달 받은 문자를 저장하기위한 변수이며, recvfrom의 인자 55555는 최대 몇바이트까지 전달 받을 것인가에 대한 것이다.

※ recv가 기본이지만 from 을 붙여주면 다음과 같은 차이가 있다.

# 이와 같이 recvfrom을 사용!

 

# 호스트 컴퓨터로 nc프로그램을 이용하여 문자열을 보내 보았다. ! (-u 옵션은 UDP 통신)

# NetCat프로그램은 Network connection에서 read, write를 할 수 있는 유틸리티 프로그램 입니다.

# 여기서 nc는 아직 만들지 않은 Client를 대신하기위해 쓰인것 입니다.

 

# 위와같이 전달받은 문자열과 어디서 보냈는지에 대한 정보가 나온것을 확인할 수 있다.  (그냥 recv메서드를 이용하면 ip와 포트에 대한 정보가 나오지 않는다.)

 

기본적인 테스트를 끝내고 제대로된 코딩을 하기 앞서 2가지를 알고 넘어가야한다.

 

첫번째는 decode와 encode이다. 파이썬은 기본적으로 유니코드를 지원하고 있다. 하지만 우리가 네트워크상으로 문자를 주고 받을때에는 bytes, bytearray 타입으로 바꿔주어야 한다. Client에서 문자데이터를 보낸다면 bytes type으로 메시지가 오게 되는데 받은 메시지를 파이선에서 출력하고 싶다면 받은문자열.decode()를 통해 decoding 해주어야하고 만약 보낼 문자열이 있다면 보낼 문자열.encoding()을 해주어야 한다. 지금 하는 말이 정확히 이해가 안간다면 소스코드를 보면서 이해하면 된다.

 

두번째는 send() 와 sendto() 의 차이입니다. send() 메서드는 기본적으로 원하는 ip에 데이터를 보내는 역할을 합니다.

결론적으로 얘기하면 send()는 TCP용이고 sendto()는 UDP용 입니다. 이 두 함수의 차이점을 이해하기 위해서는 TCP와 UDP의 차이점을 알고 있어야 합니다. send()는 서버에 전송 된 바이트 수를 추적하며, 명령은 모든 buffer_size가 서버에 수신 된 경우에만 성공적으로 끝이납니다. 하지만 sendto()의 경우에는 서버가 이 버퍼를 실제로 수신했는지 여부에 대한 정보가 없어도 버퍼를 대상에 보냅니다. 따리서 지금 하는 UDP의 예제에서는 sendto()를 쓰고있다는 것을 알아야 합니다.

 

자, 그럼이제 예제를 봅시다 :)

 


Server

 

# 먼저, print를 통해 server에 대한 기본 정보를 출력해주고 있다.  ( 파이썬의 format방법을 모른다면 별도의 공부가 필요하다.! )

# while문을 확인해보면 지속적으로 recvfrom()를 통해 데이터를 받고, 클라이언트가 데이터를 보내면 튜플형태로 그 정보를 받게 되는데 data와 info에 저장한다. data에는 데이터 값이 저장되고 , info에는 ( ip 주소, 포트번호)가 저장 된다.

# client로부터 받은 데이터 중 info변수에 있는 클라이언트의 ip와 포트번호를 출력한다.

# 데이터로 온 내용(data)을 data.decode()를 통해 변환된 값을 출력해 준다.

# 마지막으로, sock.sendto를 통해 사용자가 보낸 data를 그대로 되돌려 준다.

# NC로 데이터를 보낸 결과.

 

 


Client

# 워낙 간단한 Server, Client 이기 때문에 Client도 크게 어려울게 없다.

# 마찬가지로 socket을 생성해준다.

# bind를 만들어 주어도 되지만 Client는 굳이 만들필요가 없다 그럼 임의로 port번호가 생성된다.

# sock.sendto()를 통해 위에서 만든 Server에 hell0라는 메시지를 보내준다. 앞에 b는 bytes로 형변환을 하는 것이다. encoding과 같은 역할

# 메시지를 보내고 서버로부터 data가 오는 것을 기다려보자.!

 

# test를 위해서  Server를 동작시킨 상태로 위의 코드를 실행시켰다.

# data에 host의 ip와 port가 잘 들어가 있는 것을 확인 할 수 있다.

 

# 같은 ip에서 실행했기때문에 Server와 client의 ip가 같은 것을 확인할 수 있다.

 

 

 

 

 

'Network Hacking' 카테고리의 다른 글

6일차] MAKE Python Module For Ethernet Header Analysis  (0) 2018.03.19
5일차]IP Story  (0) 2018.03.16
4일차] Header analysis(Udp, Ip, Ethernet Header)  (0) 2018.03.15
3일차] TCP Server, Client  (0) 2018.03.14
1일차] 환경 구성  (0) 2018.03.12