공유 메모리라는 단어가 보이고, key_t 의 값도 주어졌다.
우선 잘 모르겠으니 리눅스 공유 메모리를 구글링해보자.
*** ipcs 명령어
: OS에서 프로그램이 사용하는 IPC, 공유메모리, 세마포어를 현황 파악 가능
: 옵션
[IPC 확인]
ipcs -q
[공유 메모리 (Shared Memory) 확인 ]
ipcs -m
[세마포어 확인 ]
ipcs -s
한번 공유 메모리를 확인해보기 위해 ipcs 명령어를 이용해보자.
key 0x0001d6a 가 보이고, 소유자는 root, 허가는 0666, 용량은 1028인 공유메모리가 있는 것을 볼 수 있다.
이 값은 10진수로 환산해보면,
힌트에 주어진 key 값인 7530 인 것을 알 수 있다.
이제 공유 메모리에 접속해서 사용할 수 있도록 함수 shmget() 과 shmat() 에 대해 살펴보자.
*** shmget()
: 공유메모리 공간을 요청하는 함수
: shmget(key, size, shmflg)
: key - 공유메모리 Key 값, 이 값을 통해 커널에서 공유메모리를 선택해 접근 가능
: shmflg - 공유메모리 생성방식
1) IPC_CREAT : 첫번째 식별자인 key 값이 없을시 새로 만듦. 뒤에 "|" 을 붙여 접근권한 설정이 가능.
만약 이미 key가 존재한다면 존재하는 공유메모리의 식별자를 리턴.
2) IPC_EXCL : 해당 key를 가진 공유메모리가 존재할 경우, 실패값을 반환하고 메모리 접근을 통제.
: 결과적으로 shmget은 공유메모리의 식별자를 리턴(int)
*** shmat()
: 현 프로세스가 공유메모리를 사용가능하도록 하는 함수
: shmat(shmid, shmaddr, shmflg)
: shmid - 공유메모리의 식별자. 즉, shmget함수에서 나온 결과
: shmaddr : 메모리가 붙을 주소. 0을 지정하면 커널에서 자동으로 지정.
: shmflg : 동작 형식
1) SHM_RDONLY : 읽기전용으로 동작합니다.
2) SHM_RND : shmaddr을 반올림해 메모리 페이지 경계에 맞춥니다.(shmaddr이 null이 아닐때만 사용됩니다. )
3) 아무것도 없을경우 : 읽기/쓰기 전용으로 동작합니다.
: 결과적으로 공유메모리 식별자에 대한 주소를 리턴.
shmget 함수를 이용해서 앞서 ipcs 명령어로 확인했던 공유 메모리의 접근권한인 0666과, key 값등을 이용해 공유 메모리 요청을 하고,
shmat 함수를 이용해 내 프로세스가 7530 프로세스에 접근할 수 있도록 소스를 입력해보자.
/tmp 로 이동한 후, key.c 를 생성해주면 된다.
이렇게 인자를 입력해주고 printf 로 b 를 출력해주어야 공유 메모리에 접근한 후 값이 출력된다.
printf 안해주면 ? 아무것도 안 뜸.
7530 공유 메모리에 접근해서 값을 출력하면,
level11 password "what!@#$?" 획득
참고 https://jink1982.tistory.com/87
https://choraengyi.tistory.com/44
'WARGAME > FTZ [system]' 카테고리의 다른 글
ftz level 12 [level12] (0) | 2020.04.30 |
---|---|
ftz level 11 [level11] (0) | 2020.04.30 |
ftz level 9 [level9] (0) | 2020.04.30 |
ftz level 8 [level8] (0) | 2020.04.30 |
ftz level 7 [level7] (0) | 2020.04.30 |