본문 바로가기

카테고리 없음

level10 - 공유 메모리

암복호화 키를 다른 서버에 둔다는 개념을 바탕으로 한 애플리케이션 개념

1. 안전한 키 관리를 위해 외부에 노출돼 있는 웹서버와 분리해 독립적인 장소인 키 관리 서버에 키를 따로 둔다.

2. 키 관리 서버에서 웹서버로 키를 전송한다.

3. 웹서버에서는 키를 디스크에 저장하지 않고 메모리의 특정 위치에 둔다.

4. 웹서버에서는 데이터를 저장하고 읽을 때 암복호화 과정에서 메모리의 특정 위치에 있는 키를 읽어서 사용한다.

 

# 이번 레벨10의 핵심은 암복호화 과정에서 메모리의 특정 위치에 있는 키를 읽는 다는 것이다.

 

 

[문제]

# 힌트를 보면 암호화 키가 있는 메모리 위치에 대한 정확한 정보가 문제에 제시 되어 있다.

 

 

먼저, 공유 메모리에 대해 알아보자.

 

공유메모리란??

용어 그대로 공유 메모리란 프로세스 간에 공유해서 쓰는 메모리를 의미한다.

프로세스는 각자 자신만이 사용할 메모리 공간을 할당해서 사용한다. 따라서 다른 프로세스에서 사용하는 메로리 공간은 침범할 수 없다. 하지만 프로세스 간에 서로 데이터를 공유해야 하는 필요성 때문에 IPC(InterProcessCommunication)라는 기법이 생겨났다. 큰 프로그램은 하나의 프로세스로 구현하기 힘들기 때문에 여러 개의 프로세스로 기능을 분리해서 만들게 되는데, 여기서 서로 다른 프로세스 간에도 데이터를 공유할 필요성이 생긴다. 즉, 공유 메모리는 프로그램을 개발할 때 함수로 각종 기능을 분리하고 함수 간에 인자로 데이터를 전달하는 것과 개념상 비슷하며, 프로그램의 복잡도가 훨씬 높은 큰 프로세스 간에 데이터를 주고받는 개념으로 이해하면 된다.

 

 

 

공유 메모리 관련 함수 설명

# int shmget(key_t key, int size, int shmflg);

이 함수는 공유메모리를 생성하거나 생성된 공유 메모리를 상용할 수 있는 함수다.

      key_t key : 공유 메모리를 읽기 위한 key 변수

int size : 공유 메모리 크기

int shmflg : 공유 메모리 생성이나 사용 옵션을 지정한다.

반환값 : 공유 메모리를 생성하거나 생성돼 있는 공유된 메모리의 ID를 반환한다.

 

# void shmat(int shmid, const void shmaddr, int shmflg);

이 함수는 이미 할당된 공유 메모리 공간을 다른 프로세스에서 사용할 수 있게 권한을 부여하는 함수다.

int shmid : 공유 메모리를 생성할 때 만들어진 공유 메모리의 ID

shmaddr : 공유 메모리가 할당된 주소

int shmflg : 공유 메모리 사용 옵션을 지정

 

# INT shmdt(const void shmaddr);

이 함수는 다른 프로세스에 연결된 공유 메모리 공간의 사용을 끝낸 후 프로세스와 공유 메모리 공간의 연결을 끊는 함수이다.

 

이제 위의 설명을 토대로 문제를 해결해 보자.

 

 

문제 해결

# 위와같이 keyval 값을 통해 해당 7530 메모리 값을 쓰고, ID를 통해 공유 메모리 공간을 사용할 수 있게 연결한다. 그리고 sharedMemory에있는 값을 buf에 복사해 출력하는 모습이다.

 

[level10@ftz tmp]$ ./lvl10_exe

멍멍 : level11의 패스워드는?

구타: what!@#$?

 

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ

 

이번 레벨은 프로세스 간 통신이 필요한 이유와 프로세스 간 통신에 사용되는 한 기법인 공유메모리에 대한 내용이였다.!