본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level10 -> level11 ) by ORANG

FTZ_level10

 

 [level10@ftz level10]$ cat hint

 

 

두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다.

그 대화방은 공유 메모리를 이용하여 만들어졌으며,

key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여

level11의 권한을 얻어라.

 

- 레벨을 완료하셨다면 소스는 지우고 나가주세요.

 

 

이 문제를 풀려면 공유 메모리에 대한 개념이 필요합니다.

공유 메모리란 여러 프로세스가 공유하는 메모리 공간.. 입니다.

 

예를 들면 A라는 프로세스와 B라는 프로세스가 공유 메모리를 사용할 때,

A와 B 프로세스는 각각의 메모리 공간을 가지고, 두 프로세스가 모두 사용할 수 있는 공유 메모리를 가집니다.

공유 메모리를 사용하는 프로세스들은 해당 메모리에 접근할 수 있으므로

A와 B의 공유 메모리를 사용하는 C 프로세스를 만들면, 공유 메모리에 접근할 수 있겠네요ㅎㅎ

그럼 key_t값이 7530인 공유메모리를 가진 프로세스를 만들어볼까요??

 

우선은 공유 메모리에 대해 더 찾아보겠습니다.

 

좋은 자료가 있어서 첨부했습니다~~

 ***공유메모리생성_ 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 : 동작 옵션

            IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다. 만약있다면 무시하며

                                      생성을 위해 접근 권한을 지정해 주어야 한다.

            IPC_EXCL : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다.

                                   이 옵션이 없어야 기존 공유 메모리에 접근할 수 있다.

반환 -1 : 실패

          -1 이외 : 공유 메모리 생성 성공, 공유 메모리 식별자

 

 

***공유 메모리를 프로세스에 첨부_shmat()***

#include <sys/type.h>

#include <sys/shm.h>

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

 

int shmid : 공유 메모리를 구별하는 식별번호

void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL을 지정

int shmflg : 동작옵션

            SHM_RDONLY : 공유 메모리를 읽기 전용으로

            SHM_RND : shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여

                                   메모리 페이지 경계에 맞춘다.

반환 (void *)-1 : 실패

          이외 : 프로세스에 첨부된 프로세스에서의 공유 메모리 주소

 

***공유 메모리를 분리_shmdt()***

#include <sys/type.h>

#include <sys/shm.h>

int shmdt(const void *shmaddr);

 

void *shmaddr : 분리할 공유 메모리 주소

반환 -1 : 실패

            0 : 공유 메모리 분리 성공

 

[출처] http://blog.naver.com/nature128/130073681032

 

 

shmget 함수를 통해 공유 메모리를 생성하고

shmat 함수는 공유 메모리를 사용 가능하게 이어 붙이고

shmdt 함수는 공유 메모리를 분리시키는 역할을 한다고 합니다

이제 필요한 프로그램을 만들어 보겠습니다

 

 [level10@ftz tmp]$ cat lvl10.c

#include <sys/ipc.h> // <sys/type.h>가 포함?되지 않아 manual 참고했습니다

#include <sys/shm.h>

#include <stdio.h>

 

int main(void)

{

        int shmid = shmget(7530, 0, IPC_CREAT);

// key값 7530

 

        char *shmstr = shmat(shmid, NULL, SHM_RDONLY);

// shmget 함수가 공유 메모리 세그먼트 식별자를 반환하므로

// 2번째 인자 값 NULL -> 시스템이 사용되지않은 적당한 메모리 영역 주소를 찾아줌

// SHM_RDONLY -> 읽기 전용

 

        printf("%s\n", shmstr);

}

[level10@ftz tmp]$ ./lvl10

멍멍: level11의 패스워드는?

구타: what!@#$?