_

cat 명령어로 hint를 읽었다.
두 명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다.
그 대화방은 공유 메모리를 이용하여 만들어졌으며,
key_t의 값은 7540이다. 이를 이용해 두 사람의 대화를 도청하여 level11의 권한을 얻어라.

먼저 program 파일이 생소해서 ls도 해보고 실행도 해봤으나
permission denied 오류가 난다. 권한이 없는 듯 하다.
*공유메모리
서로 다른 프로세스가 특정 메모리를 공유하면서 데이터에 더 빠르게 접근하도록 하는 방법
1) shmget
- 인자로 전달된 key의 값으로 공유메모리를 얻고 공유메모리 조각의 id를 돌려줌
int shmget(key_t key, size_t size, int shmflg);
▷key: 공유메모리를 할당할 때 사용하는 고유한 key 값
▷size: 메모리의 최소 크기. 새로운 공유 메모리 받을 시 명시하고 이미 존재하는 메모리 일 시 0으로 할당
▷shmflg: IPC_CREAT(새로운 메모리 세그먼트 생성)
IPC_EXCL(IPC_CREAT와 함께 쓰는 플래그. 공유 메모리가 있는지 확인 후 없으면 IPC_CREAT로 할당 받아라)
2) shmat
- 공유메모리를 얻었으면 메모리의 위치에 이 프로세스를 묶는 시스템 콜
void *shmat(int shmid, const void* shmaddr, int shmflg);
shmid: 공유메모리의 id를 의미. shmget으로 얻으면 됨
shmaddr: NULL일 경우 커널에서 적절한 주소 반환/ 실패하면 -1 반환
3) shmdt
- 공유메모리를 이 프로세스와 떼어냄. 이를 제거 하는 것은 아님
int shmdt(const void* shmaddr);
shmaddr: shmat에서 전달받은 그 포인트를 전달하면 됨. 성공 0 실패 -1
4) shmctl
- 공유메모리를 제어하기 위해 사용
- 공유메모리의 정보를 얻거나 어떤 값을 쓰거나 메모리를 삭제
int shmctl(int shmid, int cmd, struct shmid_ds* buf);
shmid: 공유메모리 id
cmd: 제어할 command
buf: shmid_ds라는 구조체
* 공유메모리 명령어
1) ipcs : 사용하는 IPC, 공유메모리, 세마포어 현황을 파악할 수 있음
ipcs -q : IPC 확인
ipcs -m : 공유 메모리 확인
ipcs -s : 세마포어 확인 (semid 확인)
2) ipcrm
ipcrm -q [msgid]: IPC 삭제
ipcrm -m [shmid]: 공유메모리 삭제
ipcrm -s [semid]: 세마포어 삭제

ipcs 명령어로 공유 메모리의 현황을 확인했다.
0x00001d6a 를 진수변환기로 확인해보니 key_t인 7530이 나온다.

level10 디렉토리에서 vi로 c파일을 생성하려고 하면
파일명과 관계없이 저장이 안되어서 tmp로 이동했다.
ls 명령어로 tmp가 비어있는 것을 확인했다.

leve10.c라는 이름으로 코드를 작성했다.
shmget으로 공유메모리를 할당 받았으며 이를 a에 대입했다.
shmat함수와 a를 활용하여 공유메모리의 위치에 프로세스를 묶었다.

char로 b를 할당해 놓고 정작
shmat의 내용을 할당하는 변수는 p로 하여서 오류가 발생했다.
아무생각 없이 b로 해놓고 프로세스라 할당은 p로 받은듯

잘못된 부분을 vi로 다시 수정하고, gcc 명령어로 컴파일한 뒤
leve10의 절대경로로 실행했더니 level11의 패스워드를 얻을 수 있었다.


hint에서 요구했던 것 처럼 실행 후 leve10, leve10.c는 삭제