2017. 5. 23. 14:38ㆍSystemHacking/FTZ
level10 문제는 공유메모리에 관한 문제입니다. 공유메모리와 관련된 개념부터 알아보겠습니다
공유메모리란 여러 프로세스들이 특정한 메모리 공간을 공유해서 데이터를 주고받을 수 있도록 하는 메모리 공간입니다
공유메모리를 사용하는 소스코드를 살펴보도록 합시다
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 >
공유메모리에 관한 함수만 알고있다면 쉽게 풀 수 있는 문제입니다
다음 문제로 넘어가도록 하겠습니다
'SystemHacking > FTZ' 카테고리의 다른 글
FTZ level12 Buffer OverFlow (0) | 2017.05.23 |
---|---|
FTZ level11포맷 스트링 버그를 이용한 풀이 (0) | 2017.05.23 |
FTZ level9 Buffer OverFlow (0) | 2017.05.23 |
FTZ level8 리눅스 패스워드 파일 크랙 (0) | 2017.05.23 |
FTZ level7 암호화 (0) | 2017.05.23 |