Sqix

FTZ Level10 본문

Wargame/FTZ

FTZ Level10

Sqix_ow 2018. 6. 18. 01:14


==============================================

hint


두 명의 사용자가 대화방을 이용해 비밀스러운 대화를 나누고 있다.

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

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

level11의 권한을 얻어라.


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


==============================================



program이라는 디렉토리가 있습니다. 읽기 권한과 실행 권한이 있습니다. 그런데 권한이 root입니다. cd도 먹히지 않습니다.


$ find / -perm +6000 -user level11 2> /dev/null로 level11의 setuid가 걸린 파일을 찾아봤지만, 역시 이 또한 없습니다. 꽤나 당황스럽네요....


힌트에 나온 내용을 정리하면, 공유 메모리를 이용해야 한다는 것이고, 메모리 영역에  대한 key값인 key_t는 7530이라는 것입니다.


공유 메모리의 해당 영역을 파싱해 보면, 뭔가가 있을 수도 있다는 생각이 듭니다.


https://www.joinc.co.kr/w/Site/system_programing/IPC/SharedMemory <- 공유 메모리에 대한 글입니다. 


시스템 프로그래밍과 관련된 내용이 필요할 것 같습니다. 만약 이해가 잘 되지 않는다면, 윗 글을 읽어 보고 오시길 바랍니다.


우선, 주어진 공유 메모리 영역에 대한 key_t값이 7530이기 때문에, 해당 영역의 데이터를 파싱해 보겠습니다.


#include <stdio.h>

#include <sys/types.h>

#include <sys/shm.h>


#define BUFSIZE 1024


int main(void)

{

void *shmAddr;

int shmId;

struct shmid_ds shmStatus;

key_t shmArea = 7530;


if((shmId = shmget(shmArea,BUFSIZE,IPC_CREAT|0666)) == -1)

{

perror("shmget Failed");

exit(1);

}

if((shmAddr = shmat(shmId, (void *)0, 0)) == (void *)-1)

{

perror("shmat Failed");

exit(1);

}

printf("%s\n", (char *)shmAddr);


if((shmdt(shmAddr)) == -1)

{

perror("shmdt Failed");

exit(1);

}

return 0;

}


하나하나 설명을 해 보겠습니다.

우선, <sys/types.h>, <sys/shm.h> 헤더는 공유 메모리에 관계된 함수가 있는 헤더입니다.

shmid_ds 구조체는 쓰이진 않았지만, 혹시나 쓰게 될까 싶어 선언했던 구조체입니다. 해당 구조체는 <sys/shm.h> 에 선언되어 있고프로세스가 Shared Memory 공간을 요청하게 되면 커널은 이를 할당해 주고, 관련된 정보를 shmid_ds 구조체에 할당하여 관리하게 됩니다. 


struct shmid_ds

{

struct                ipc_perm shm_perm;    // Permission

int                     shm_segsz;                    // Size of Allocated Address 

time_t               shm_atime;                   // Recently Attached time

time_t               shm_dtime;                   // Recently Detached time

time_t               shm_ctime;                   // Recently Changed time

unsigned short shm_cpid;                     // pid of process

unsigned short shm_lpid;                     // pid of Last process

short                 shm_nattch                  // Number of Process

}


shmget 함수는 공유메모리 공간을 요청하기 위한 System call 함수입니다. 함수 형식은 다음과 같습니다.


shmget(key_t keyval, size_t BUFSIZE, IPC_CREAT | PERMISSION);


key_t는 고유메모리 영역을 나타내는 key값으로, 여기서는 7530이 이에 해당합니다. 1024는 메모리 버퍼 최대 크기, IPC_CREAT는 새로운 공유 메모리를 생성한다는 의미의 인자이고, PERMISSION은 네 자리의 숫자로 [SETUID || SETGID || STICKY BIT][ROOT RWx][USER RWX][GUEST RWX]의 4자리 숫자를 의미합니다.


해당 함수는 공유메모리 접근을 할 수 있도록 해 주는 int 타입의 디스크립터를 반환합니다.


shmat 함수는 공유메모리에 접근할 수 있는 디스크립터를 이용해서 공유메모리에 attach를 할 수 있도록 하는 함수입니다. 형식은 다음과 같습니다.


shmat(int shmid, void *memAddr, int permission) 


shmid는 shmget의 반환값, 즉 int 타입의 디스크립터입니다. memAddr은 접근하도록 하는 공유메모리입니다. 일반적으로 (void *)0을 넣으며, 이럴 경우 커널이 자동으로 메모리를 지정합니다. permission은 퍼미션으로, 0을 넣으면 R/W 권한을, SHM_RDONLY를 넣으면 읽기 권한만을 가집니다.


해당 함수는 접근한 공유메모리의 주소를 반환합니다.


shmdt 함수는 공유유메모리 접근 해제 함수입니다. 함수 형식은 다음과 같습니다.


shmdt(void *memAddr)


해당 함수는 detach가 성공하면 0, 실패하면 -1을 반환합니다. memAddr은 shmat 함수에서 반환한, 접근한 공유 메모리의 주소입니다. 


이렇게 세 함수를 이용하여 공유메모리의 값을 읽어올 수 있습니다.


여기에 printf 함수를 이용해 그 값을 출력할 수 있습니다.




한글이 깨져서 나오네요.. 원래는 


멍멍 : level11의 패스워드는?

구타 : FTZ{flag_is_this} 


이러한 형식으로 나온다고 합니다.

'Wargame > FTZ' 카테고리의 다른 글

FTZ Level12  (0) 2018.06.29
FTZ Level11  (0) 2018.06.18
FTZ Level9  (0) 2018.06.18
FTZ Level8  (0) 2018.06.17
FTZ Level7  (0) 2018.06.12
Comments