본문 바로가기
Hack/ftz

ftz 풀이 level10

by Choraengyi 2016. 12. 12.

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을 풀어보았습니다.


728x90
반응형

'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

댓글