ftz level10을 풀어보겠습니다.
우선 힌트를 조회해 보니 대화방이 있는데 공유메모리를 이용하여 만들어 졌고 key의 값을 알려주었습니다.
그리고 대화를 도청하여 패스워드를 도출하라는 문제 입니다. 레벨을 다 풀면 소스를 지워달라고 하는 군요..
우선 이번 문제에서는 공유메모리와 key_t 에 포커스가 맞추어져 있는거 같습니다. 그리고 소스를 지우라는거 보니 코딩도 하는거 같습니다.
우선 공유메모리에 대해 짚고 넘어가겠습니다.
공유메모리 : 보통 프로세스는 각자의 메모리공간을 가지게 되는데, 프로세스간의 통신이 필요해져 여러프로세스가 한 메모리 공간을 사용하며, 서로 통신을 하고 수행 속도도 원할하게 만드는 메모리 기술 입니다.
쉽게 말해 한 메모리공간을 여러 프로세스(프로그램)가 사용하는 것 입니다.
리눅스에서 이 공유 메모리를 조회할 수 있는 도구가 있습니다.
ipcs
ipc(프로세스간 통신) 설비 정보를 보여줍니다.
사용법
ipcs [option]
옵션은 아래와 같이 있습니다. 초록색부분이 리소스, 파란부분이 해당모드로 출력합니다.
옵션 |
의 미 |
-i |
특정 id에 대한 정보를 알 수 있습니다. 뒤에 해당 id를 적어야 합니다. |
-m |
공유 메모리 세그먼트정보를 출력합니다. |
-q |
메세지 큐 정보를 출력합니다. |
-s |
세마포어 배열 정보를 출력합니다. |
-a |
m, q, s 의 모든 리소스 정보를 출력합니다. |
-t |
시간 정보가 보여집니다. |
-p |
pid 정보가 보여집니다. |
-c |
만든사용자가 보여집니다. |
-l |
각 리소스의 제한 정보를 보여줍니다. |
-u | 각 리소스의 현황을 보여줍니다. |
리소스 선택
출력모드 선택
순서대로 -m옵션 공유 메모리 세그먼트 정보, -q 메세지 큐정보, -s 세마포어 배열 정보를 출력합니다.
그리고 -a 옵션을 쓰면 위의 세개 옵션이 합쳐져서 출력됩니다.
그리고 해당 리소스에 출력모드를 붙여 출력할 수 있습니다. 모든 리소스를 출력하고 제한정보가 보이도록 했습니다.
모든 리소스를 출력하고 시간정보가 보이도록 했습니다.
메모리 세그먼트 정보를 보면 아래와 같은 정보가 나옵니다.
정보를 보면 0x00001d6a 이 16진수를 10진수로 변환하면 7530이라는 값이 있음을 알 수 있습니다.
현재 key 값이 7530이고 소유자는 root, 허가는 0666, 용량은 1028인 공유메모리가 있음을 알 수 있습니다.
이제 이 공유 메모리에 제 프로세스로 접속해서 대화내용을 보겠습니다.
공유메모리 관련함수( C언어)
1. shmget
공유메모리 공간을 요청하는 함수 입니다. 요청은 커널에 합니다.
shmget(key, size, shmflg)
*key : 공유메모리 Key 값, 이 값을 통해 커널에서 공유메모리를 선택해 접근 가능합니다.
*size : 공유메모리의 크기입니다. 최초생성시에는 크기를 지정해야 하나, 존재하는 메모리를 그대로 사용하면 0으로 입력하면 됩니다.
*shmflg : 공유메모리의 생성방식입니다. 2가지가 있습니다.
1) IPC_CREAT : 첫번째 식별자인 key 값이 없을시 새로 만듭니다. 뒤에 "|" 을 붙여 접근권한 설정이 가능합니다. 만약 이미 key가 존재한다면 존재하는 공유메모리의 식별자를 리턴합니다.
2) IPC_EXCL : 해당 key를 가진 공유메모리 존재할 경우, 실패값을 반환하고 메모리에 접근을 통제 합니다.
결과적으로 shmget은 공유메모리의 식별자를 리턴(int)하게 됩니다.
2. shmat
현 프로세스가 공유메모리를 사용가능하도록 하는 함수 입니다. 공유메모리 식별자에 공유메모리 세그먼트를 붙이기 위해 사용합니다.
shmat(shmid, shmaddr, shmflg)
*shmid : 공유메모리의 식별자입니다. shmget함수에서 나온 결과
*shmaddr : 메모리가 붙을 주소입니다. 0을 지정하면 커널에서 자동으로 지정해줍니다.
*shmflg : 동작모드 3가지 있습니다.
1) SHM_RDONLY : 읽기전용으로 동작합니다.
2) SHM_RND : shmaddr을 반올림해 메모리 페이지 경계에 맞춥니다.(shmaddr이 null이 아닐때만 사용됩니다. )
3) 아무것도 없을경우 : 읽기/쓰기 전용으로 동작합니다.
결과적으로 공유메모리 식별자에 대한 주소를 리턴하게 됩니다.
3. shmdt
프로세스가 공유메모리를 더 사용하지 않을 경우 그 둘을 분리하는 함수 입니다.
shmdt(shmaddr)
*shmaddr : 공유메모리 주소입니다. 해당 주소가 분리됩니다.
해당 함수를 동작시키면 현프로세스가 공유메모리에서 분리되고 shmid_ds의 내용을 커널이 갱신합니다.
4. shmctl
공유메모리를 제어하는 함수 입니다.
shmctl(shmid, cmd, shmid_ds *buf)
*shmid : 공유메모리 식별자
*cmd : 제어명령
1) IPC_STAT : 공유메모리에 관한 정보를 buf에 저장합니다.
2) IPC_SET : 공유메모리 공간에 대한 권한 변경을 합니다.
3) IPC_RMID : 공유메모리 공간을 삭제합니다.
4) SHM_LOCK : 공유메모리 세그먼트를 잠급니다.
5) SHM_UNLOCK : 공유메모리 세그먼트 잠금을 해제합니다.
*shmid_ds *buf : 공유메모리 정보를 구할 수 있는 버퍼 포인터 입니다.
이제 어느 정도 알았으니 공유메모리로 진입하기 위한 코딩을 해보겠습니다.
#include <stdio.h> #include <sys/shm.h> //shm관련 함수를 사용하기 위한 헤더 #include <sys/ipc.h> //shm관련 함수를 사용하기 위한 헤더 int main(){ int shmid; //공유메모리 식별자를 받는 int형 char *address; //공유메모리 주소를 받는 char 포인터 key_t key = 7530; //주어진 키값을 key_t형 key 변수에 대입 shmid = shmget(key, 0, IPC_CREAT); //해당key값이 이미 존재하므로 존재하는 공유메모리 식별자를 리턴합니다. address = shmat(shmid, 0, SHM_RDONLY); //해당 식별자의 주소를 읽기전용으로 리턴합니다. printf("%s", address); //해당 공유메모리의 내용을 읽어옵니다. return 0; } |
tmp 디렉터리로 이동하여 ipc.c 로 코딩하였습니다.
$ vi ipc.c
해당 파일을 컴파일 합니다.
$ gcc -o ipc ipc.c
컴파일 후에 실행하면 대화내용이 출력 됩니다.
끝으로 소스파일은 지워주셔야 합니다.
$ rm -rf ipc*
ftz level10을 풀어보았습니다.
'Hack > ftz' 카테고리의 다른 글
ftz 풀이 level12 (0) | 2016.12.31 |
---|---|
ftz 풀이 level11 (0) | 2016.12.28 |
ftz 풀이 level9 (0) | 2016.12.07 |
ftz 풀이 level8 (0) | 2016.12.01 |
ftz 풀이 level7 (0) | 2016.11.29 |
댓글