공유메모리를 사용해 대화를 도청하라는 힌트가 주어졌다. key_t의 값은 7530이라고 한다. 7530을 이용해 둘의 공유 메모리를 같이 공유하라는 의미 같다.
공유메모리에 대해 먼저 알아봤다.
공유 메모리
공유메모리는 여러 프로그램이 동시에 접근할 수 있는 메모리라고 한다.
프로세스는 자신만의 메모리 영역을 가지고 있기 때문에 다른 프로세스에서 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV 경고 시그널을 보낸다고 한다.
하지만 메모리 영역에 있는 데이터를 다른 프로세스에서 사용할 수 있어야 할 때가 있을 때를 위해 메모리 영역을 공유할 수 있다.
이 공유메모리를 이용해 프로세스끼리 통신도 할 수 있으며 같은 데이터를 공유할 수 있다.
다시말해 공유메모리를 사용하는 방법은 공유메모리를 생성한 후 이 메모리가 필요한 프로세스는 필요할 때 자신의 프로세스에 첨부를 한 후 다른 메모리를 사용하듯 사용하면 된다.
아래는 공유메모리 함수들에 대한 설명이다.
shmget
공유메모리 생성
헤더 |
#include <sys/ipc.h> #include <sys/shm.h> |
형태 |
int shmget(key_t key, int size, int shmflg); |
인수 |
key_t key : 공유 메모리를 구별하는 식별 번호 int size : 공유 메모리 크기 int shmflg : 동작 옵션 1. IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다. 만약 있다면 무시하며 생성을 위해 접근 권한을 지정해 주어야 한다. 2.IPC_EXCL : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다. |
반환 |
-1 : 실패 -1 이외 : 공유 메모리 생성 성공, 공유 메모리 식별자 |
shmat
공유메모리 연결
헤더 |
#include <sys/ipc.h> #include <sys/shm.h> |
형태 |
void *shmat(int shmid, const void *shmaddr, int shmflg) |
인수 | int shmid : 공유메모리를 구별하는 식별 번호 void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL 지정 int shmflg : 동작 옵션 1. SHM_RDONLY : 공유 메모리를 읽기 전용으로 2. SHM_RND : shmaddr이 NULL이 아닌 경우일 때 사용되며, shmaddr 을 반올림하여 메모리 페이지 경계에 맞춘다. |
반환 |
(void *)-1 이외 : 프로세스에 첨부된 프로세스에서의 공유 메모리 주소(성공 시 해당 공유 메모리의 첫 번째 바이트에 대한 포인터를 반환) (void *) -1 : 실패 |
shmdt
헤더 |
#include <sys/type.h> #include <sys.shm.h> |
형태 |
int shmdt(const void *shmaddr); |
인수 |
void * shmaddr : 분리할 공유 메모리 주소 |
반환 |
-1 : 실패 0 : 공유 메모리 분리 성공 |
이제 위 설명 대로 공유 메모리를 생성해 답을 훔쳐보는 코드를 작성한다.
해당 코드를 컴파일 하여 실행하면 답이 나온다.
'Wargame > FTZ' 카테고리의 다른 글
[FTZ] level12@ftz (0) | 2017.11.10 |
---|---|
[FTZ] level11@ftz (0) | 2017.11.10 |
[FTZ] level9@ftz (0) | 2017.11.09 |
[FTZ] level8@ftz (0) | 2017.11.09 |
[FTZ] level7@ftz (0) | 2017.11.09 |