CIDY
[Pwnable] Socket Programming 본문
이게 왜 포너블 카테고리일까..
What is socket programming?
네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것이다. (네트워크 프로그래밍)
Socket Connection
보통 서버는 특정 포트가 바인딩 된 소켓을 가지고 특정 컴퓨터 위에서 돌아가며, 서버는 소켓을 통해 클라이언트의 연결 요청을 리스닝하며 기다린다. 클라이언트는 서버가 돌아가는 머신의 호스트네임과, 서버가 리스닝하고 있는 포트 번호를 통해 서버와 연결을 시도할 수 있다. 이 때 클라이언트는 서버가 자신을 식별할 수 있도록 연결동안 사용될 로컬 포트에 바인딩되며, 이러한 포트 바인딩 작업은 시스템에 의해 이루어진다.
문제가 발생하지 않으면 서버는 연결을 수락하며, 이와 동시에 서버는 동일한 로컬 포트에 바인딩된 새로운 소켓을 얻게 되며 클라이언트 주소와 포트로 세팅된 리모트 엔드포인트를 가지게 된다. (서버는 연결중인 클라이언트의 요청을 처리하는 동시에 기존의 소켓을 통해서는 지속적으로 연결 요청을 받아야 하기 때문에 별개의 소켓을 필요로 한다.)
클라이언트 입장에서는 연결이 수락되면 소켓은 성공적으로 생성되며, 서버와 통신하기 위해 소켓을 사용할 수 있게 된다. 모든 과정이 완료되었다면 클라이언트와 서버는 소켓에 데이터를 쓰고 읽음으로써 통신할 수 있게 된다.
Socket
소켓은 네트워크상에서 돌아가는 두 개의 프로그램 간 양방향 통신의 하나의 엔드포인트이다. 소켓은 포트 번호에 바인딩되어 TCP레이어에서 데이터가 전달되어야하는 어플리케이션을 식별할 수 있도록 해준다. (이 때 엔드포인트란 ip주소와 포트 번호의 조합을 의미한다. 모든 TCP연결은 2개의 엔드포인트로 유일하게 식별될 수 있고, 따라서 클라이언트와 서버 간 여러 개의 연결이 맺어질 수 있다.)
Server
1. socket() : 소켓 생성
2. bind() : 서버 ip주소와 포트를 소켓에 할당
3. listen() : 연결 대기 상태
4. accept() : 연결 요청 수락
5. read(), write() : 소켓을 통해 데이터를 읽고 쓰며 통신
6. close() : 연결 끊기
Client
1. socket() : 소켓 생성
2. connect() : 서버에 연결 시도
3. read(), write() : 소켓을 통해 데이터를 읽고 쓰며 통신
4. close() : 연결 끊기
Ref.
https://www.daleseo.com/what-is-a-socket/
'Hack > Pwnable' 카테고리의 다른 글
[Pwn + Crypto + Rev] Pyploit (0) | 2023.08.04 |
---|---|
[Pwnable.tw] 3x17 (0) | 2023.07.24 |
[Pwnable.tw] BookWriter(Write-up, 오렌지농장) (0) | 2023.03.03 |
[Pwnable.tw] Secret Of My Heart(Write-up) (2) | 2023.02.28 |
[Pwnable.tw] Starbound(Write-up) (0) | 2023.02.10 |