일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- BEST of the BEST
- Overwatch League SaberMetrics
- 오버워치
- #IntelManual
- vi
- C++11
- linux
- libtins
- vim
- #Qt Creator
- #MINT64 #Sqix
- Sqix
- vi 외부 명령어
- Network
- ftz
- >
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Find
- 인터럽트
- libpcap
- #
- KASAN
- command
- FTZ 레벨2
- #Best of the Best #OS #MINT64 #Sqix
- 오버워치 세이버메트릭스
- Today
- Total
Sqix
FTZ Level10 본문
==============================================
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;
}
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 |