🏆 2024

맛집 분야 크리에이터

🏆 2023

IT 분야 크리에이터

👩‍❤️‍👨 구독자 수

182

✒️ 게시글 수

0
https://tistory1.daumcdn.net/tistory/4631271/skin/images/blank.png 네이버블로그

🩷 방문자 추이

오늘

어제

전체

🏆 인기글 순위

티스토리 뷰

728x90
반응형

 

힌트는 위와 같습니다.

 

키워드는 공유 메모리 그리고 key_t의 값 7530 입니다.

 

리눅스에서 공유 메모리란, 간단하게 아래와 같이 정리할 수 있습니다.

 

- 공유 메모리 -
같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
같은 메모리 공간을 사용하므로 이를 통해 데이터를 주고 받을 수 있음

 

그리고 C언어에서는 공유 메모리를 다루기 위해서 여러 함수들을 지원하고 있는데요.

 

- 공유 메모리 생성 : shmget

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
// key : IPC_PRIVATE 또는 ftok 로 생성한 키값
// size : 공유할 메모리 크기
// shmflg : 공유 메모리의 속성을 지정하는 플래그
// - IPC_CREAT, IPC_EXCL
// 공유 메모리 식별자를 리턴(shmid_ds 구조체)

shmget 사용 예시

// (헤더 생략)
// 사용 예시
int main(void) {
    key_t key;
    int shmid;
    
    key = ftok("shmfile", 1);
    shmid = shmget(key, 1024, IPC_CREAT|0644);
    if (shmid == -1) {
    	perror("shmget");
        exit(1);
    }
    return 0;
}

- 공유 메모리 연결 : shmat

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
// shmid : 공유 메모리 식별자
// shmaddr : 공유 메모리를 연결할 주소
// shmflg : 공유 메모리에 대한 읽기/쓰기 권한
// - 0(읽기/쓰기 가능), SHM_RDONLY(읽기 전용)

- 공유 메모리 연결 해제 : shmdt

#include <sys/types.h>
#include <sys/shm.h>
int shmdt(char *shmaddr);
// shmaddr : 연결을 해제할 공유 메모리 주소

공유 메모리 제어 : shmctl

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
// cmd : 수행할 제어 기능
// - IPC_RMID : 공유 메모리 제거
// - IPC_SET : 공유 메모리 정보 내용 중 shm_perm.uid, shm_perm.gid, shm_perm.mode 값을 세번째 인자로 지정한 값으로 변경
// - IPC_STAT : 현재 공유 메모리의 정보를 buf에 지정한 메모리에 저장
// - SHM_LOCK : 공유 메모리를 잠근다.
// - SHM_UNLOCK : 공유 메모리의 잠금을 해제한다.

일반적으로 공유 메모리는 두 가지 형태로 구현할 수 있는데요.

 

첫 번째로는 한 프로세스에서 fork 함수를 통해 부모와 자식 간의 프로세스 간의 메모리를 공유할 때 사용하기도 합니다.

또 두 번째로는 이번 문제처럼 채팅방과 같이 서버와 클라이언트 프로세스 간의 메모리를 공유하기 위해서 사용하기도 하지요.

 

공유 메모리에 대한 복습은 이정도로 하고 이제 문제 풀이로 넘어가보도록 하겠습니다.

 

리눅스에서는 ipcs 라는 명령어가 있습니다.

위 설명에도 나와있지만, ipcs 명령어는 운영체제에서 사용하는 IPC, shared memory, semaphores의 상태를 파악할 수 있게 해주는 명령어입니다. 그 중 공유 메모리는 -m 옵션에 해당된다고 합니다.

 

명령어를 실행해보겠습니다.

그랬더니 key 가 0x1d6a 에 해당하는 공유 메모리가 한 개 활성화되어 있는 것을 확인할 수 있습니다.

0x1d6a가 10진수로 하면 7530 입니다.

바로 힌트에서 key_t의 값이 7530이라고 한 것과 일치합니다.

 

이 공유 메모리의 권한(perms)를 보니 읽기 권한이 있는 것으로 보입니다.

 

이제 이 공유 메모리를 읽기 위해서 위에서 언급한 공유 메모리 함수들을 사용해서

key 값 7530에 해당하는 공유 메모리의 내용을 읽어오는 코드를 작성해보겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int argc, char **argv) {
    key_t key;
    int shmid;
    void *shmbuf;
    char buf[1028];

    key = 0x1d6a; // 7530
    shmid = shmget(key, 1028, 0);

    shmbuf = shmat(shmid, NULL, 0);
    printf("%s\n", shmbuf);
    system("ipcs -m");
    shmdt(shmbuf);

    return 0;
}

 

위와 같이 코드를 작성하고 컴파일 하고 실행해보았습니다.

 

 

그랬더니 위와 같이 서버 채팅방으로부터 메시지를 잘 받아온 것을 확인하였고,

마지막으로 ipcs -m 명령어의 결과가 실행되어 nattch 의 값이 0 에서 1로 변경된 것으로 보아

해당 공유 메모리에 잘 연결된 것으로 보입니다.

 

이로써 level11 의 패스워드인 what!@#$? 를 잘 가져왔습니다.

 

- 끝 -

728x90
반응형
댓글