티스토리 뷰
힌트는 위와 같습니다.
키워드는 공유 메모리 그리고 key_t의 값 7530 입니다.
리눅스에서 공유 메모리란, 간단하게 아래와 같이 정리할 수 있습니다.
- 공유 메모리 -
같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
같은 메모리 공간을 사용하므로 이를 통해 데이터를 주고 받을 수 있음
그리고 C언어에서는 공유 메모리를 다루기 위해서 여러 함수들을 지원하고 있는데요.
- 공유 메모리 생성 : shmget
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
// key : IPC_PRIVATE 또는 ftok 로 생성한 키값
// size : 공유할 메모리 크기
// shmflg : 공유 메모리의 속성을 지정하는 플래그
// - IPC_CREAT, IPC_EXCL
// 공유 메모리 식별자를 리턴(shmid_ds 구조체)
shmget 사용 예시
// (헤더 생략)
// 사용 예시
int main(void) {
key_t key;
int shmid;
key = ftok("shmfile", 1);
shmid = shmget(key, 1024, IPC_CREAT|0644);
if (shmid == -1) {
perror("shmget");
exit(1);
}
return 0;
}
- 공유 메모리 연결 : shmat
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
// shmid : 공유 메모리 식별자
// shmaddr : 공유 메모리를 연결할 주소
// shmflg : 공유 메모리에 대한 읽기/쓰기 권한
// - 0(읽기/쓰기 가능), SHM_RDONLY(읽기 전용)
- 공유 메모리 연결 해제 : shmdt
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(char *shmaddr);
// shmaddr : 연결을 해제할 공유 메모리 주소
공유 메모리 제어 : shmctl
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
// cmd : 수행할 제어 기능
// - IPC_RMID : 공유 메모리 제거
// - IPC_SET : 공유 메모리 정보 내용 중 shm_perm.uid, shm_perm.gid, shm_perm.mode 값을 세번째 인자로 지정한 값으로 변경
// - IPC_STAT : 현재 공유 메모리의 정보를 buf에 지정한 메모리에 저장
// - SHM_LOCK : 공유 메모리를 잠근다.
// - SHM_UNLOCK : 공유 메모리의 잠금을 해제한다.
일반적으로 공유 메모리는 두 가지 형태로 구현할 수 있는데요.
첫 번째로는 한 프로세스에서 fork 함수를 통해 부모와 자식 간의 프로세스 간의 메모리를 공유할 때 사용하기도 합니다.
또 두 번째로는 이번 문제처럼 채팅방과 같이 서버와 클라이언트 프로세스 간의 메모리를 공유하기 위해서 사용하기도 하지요.
공유 메모리에 대한 복습은 이정도로 하고 이제 문제 풀이로 넘어가보도록 하겠습니다.
리눅스에서는 ipcs 라는 명령어가 있습니다.
위 설명에도 나와있지만, ipcs 명령어는 운영체제에서 사용하는 IPC, shared memory, semaphores의 상태를 파악할 수 있게 해주는 명령어입니다. 그 중 공유 메모리는 -m 옵션에 해당된다고 합니다.
명령어를 실행해보겠습니다.
그랬더니 key 가 0x1d6a 에 해당하는 공유 메모리가 한 개 활성화되어 있는 것을 확인할 수 있습니다.
0x1d6a가 10진수로 하면 7530 입니다.
바로 힌트에서 key_t의 값이 7530이라고 한 것과 일치합니다.
이 공유 메모리의 권한(perms)를 보니 읽기 권한이 있는 것으로 보입니다.
이제 이 공유 메모리를 읽기 위해서 위에서 언급한 공유 메모리 함수들을 사용해서
key 값 7530에 해당하는 공유 메모리의 내용을 읽어오는 코드를 작성해보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char **argv) {
key_t key;
int shmid;
void *shmbuf;
char buf[1028];
key = 0x1d6a; // 7530
shmid = shmget(key, 1028, 0);
shmbuf = shmat(shmid, NULL, 0);
printf("%s\n", shmbuf);
system("ipcs -m");
shmdt(shmbuf);
return 0;
}
위와 같이 코드를 작성하고 컴파일 하고 실행해보았습니다.
그랬더니 위와 같이 서버 채팅방으로부터 메시지를 잘 받아온 것을 확인하였고,
마지막으로 ipcs -m 명령어의 결과가 실행되어 nattch 의 값이 0 에서 1로 변경된 것으로 보아
해당 공유 메모리에 잘 연결된 것으로 보입니다.
이로써 level11 의 패스워드인 what!@#$? 를 잘 가져왔습니다.
- 끝 -
'보안 > Wargame' 카테고리의 다른 글
[dreamhack] [web] pathtraversal 문제풀이(비밀번호:FLAG) (0) | 2022.01.12 |
---|---|
[dreamhack] [web] cookie 문제풀이(비밀번호:FLAG) (0) | 2022.01.12 |
[Hackthebox] - baby BoneChewerCon Writeup(문제풀이) (0) | 2022.01.04 |
[Hackthebox] - Full Stack Conf Writeup(문제풀이) (0) | 2022.01.03 |
[Hackthebox] - baby auth Writeup(문제풀이) (0) | 2022.01.03 |