SystemHacking/FTZ

FTZ level10 공유메모리

EunHwan 2017. 5. 23. 14:38

 

 

 

level10 문제는 공유메모리에 관한 문제입니다. 공유메모리와 관련된 개념부터 알아보겠습니다

공유메모리란 여러 프로세스들이 특정한 메모리 공간을 공유해서 데이터를 주고받을 수 있도록 하는 메모리 공간입니다

공유메모리를 사용하는 소스코드를 살펴보도록 합시다




[1] shmget함수

shmget( key_t key , int size , int shmflg )

key_t key    공유 메모리들을 구별할 수 있게하는 식별 번호

int size        공유 메모리의 크기

int shmflg    동작 옵션

=> IPC_CREAT    key에 해당하는 공유메모리가 없다면 새롭게 생성해라, 있다면 접근권한을 지정해주어야한다

=> IPC_EXCL     공유메모리가 이미 있다면 실패로 반환하고 공유메모리에 접근 불가능


ex) int main(){

int shareMemoryId;

shareMemoryId = shmget( 7777 , 1024 , IPC_CREAT | 0666 );

}

=> 크기 1024byte의 공유메모리의 번호 7777 해당폴더에 모든사용자들이 읽고 쓸 수 있다


[2] shmat함수

shmat( int shmid , const void *shmaddr , int shmflg );

int shmid                     공유메모리를 생성할 때 만들어진 공유메모리의 ID ( 위에서 shareMemoryId )

const void *shmaddr      공유메모리가 할당 될 주소

int shmflg                    동작 옵션

=> SHM_RDONLY         읽기 전용

=> SHM_RND              공유 메모리 주소를 프로세스에 맞게 따로 할당한다

0                               아무 옵션 없음


ex) int main(){

int shareMemoryId;

void *shareMemory = (void *)0;

shareMemoryId = shmget( 7777 , 1024 , IPC_CREAT | 0666 );

shareMemory = shmat( shareMemoryId , (void *)0 , 0 );            

}


[3] shmdt()

shmdt( shareMemory)    프로세스와 공유메모리공간의 연결을 끊는다



[4] 세가지 함수를 모두 사용한 공유메모리를 사용 코드


#include<stdio.h>

#include<sys/shm.h>

#include<sys/types.h>


int main(){


char buf[30] = "Hello";

int shareMemoryId;

void *shareMemory = (void *)0;

key_t keyValue = 7777;


// 공유 메모리를 생성한다

shareMemoryId = shmget( keyValue , 30 , IPC_CREAT | 0666 );


// 공유메모리를 사용할 수 있는 공간을 할당한다 ㅡ 프로세스에서 공유메모리 공간을 사용할 수 있게 연결하는 것

shareMemory = shmat( shareMemoryId , (void *)0 , 0 );


// 공유 메모리 공간에 있는 값을 특정 변수 ( buf ) 에 복사한다

memcpy( buf, shareMemory , 30 );


// 프로세스에서 공유 메모리의 연결을 분리 한다

shmdt( shareMemory );


printf( "%s\n" , buf )         // 해당 소스를 실행시키면 '7777' 공유메모리에 있는 값이 출력되서 나올것이다

return 0;

}







이제 본격적으로 level10문제풀이를 시작하겠습니다



< 그림 10.1 >


힌트에서 key_t = 7530 임을 알려주고 있습니다 해당 번호의 공유메모리에 접근하여 값을 읽어오면 문제는 해결 될것입니다

그럼 해당 공유메모리에 접근하는 소스를 직접 만들어 봅시다



< 그림 10.2 >


처음 개념설명하면서 썻던 코드와 key_t 값을 바꿔서 작성한 뒤 컴파일하고 실행시키면 됩니다


< 그림 10.3 >


공유메모리에 관한 함수만 알고있다면 쉽게 풀 수 있는 문제입니다

다음 문제로 넘어가도록 하겠습니다