공유메모리 dump
shmget 함수의 원형
int shmget(key_t key, size_t size, int shmflg);
key_t key : 공유메모리의 키 값, 정수로 입력 가능, IPC_PRIVATE로 인자를 가지면 개인공유메모리 생성가능
size_t size : 생성하려는 공유메모리 크기
int shmflg : 공유메모리의 flg값으로 공유메모리의 권한, 생성 시 옵션 부여.
shmat 함수의 원형
void* shmat(int smId, const void* shm_addr, int flag);
int smId : 공유메모리 식별자
const void* shm_addr : 공유메모리와 연결하고자 하는 프로세스 내부의 메모리
int flag : 속성설정
가상메모리와 물리메모리 영역을 연결해주는 함수.
memcpy 함수의 원형
void* memcpy(void* destination, const void* source, size_t num)
void* destination : 데이터가 복사될 곳의 주소로 void*형으로 형변환되어 전달
const void* source : 복사할 데이터들이 위치한 주소로 void*형으로 형변환 되어서 전달
num : 복사할 데이터의 바이트 수를 의미
return 타입은 void* destination
shmdt 함수의 원형
int shmdt(const void* shm_addr);
작업 후 공유메모리가 필요없을 때, 공유메모리와 연결된 프로세스 내부 가상메모리 연결을 해제한다.
설명
shmget함수 = argument key의 값으로 할당한 shared memory의 id를 얻어오는 함수
여기서 얻은 shmid는 shmat함수를 이용하여 pointer에 메모리를 사용할 수 있도록
attach 혹은 assign하거나 attach된 메모리를 detach.
즉, shmat함수는 shared memory의 할당된 정보를 얻거나 변경 또는 삭제가 가능하다.
할당된 메모리는 프로세스가 종료되어도 유지되며, shmctl 함수를 이용해 삭제하거나 재부팅 시 초기화.
IPC는 프로세스간 통신하는 방법을 의미
명령어
$ ipcs
// 현재 공유메모리 보기
$ipcrm shm [shmid]
// 현재 연결된 공유메모리 제거
exploit.c
#include<STDIO.H> #include<SYS types.h> #include<SYS ipc.h> #include<SYS shm.h> #define BUFSIZE 1024 int main() { int shmid; void* shmaddr; key_t key = 7530; char buf[BUFSIZE]; shmid = shmget(key, BUFSIZE, 0666); // key값과 공유메모리 크기, 권한으로 id를 받아와서 shmid에 저장 shmaddr = shmat(shmid, (void*)0, 0); //아이디와 프로세스내부의 메모리주소, 속성 memcpy(buf, shmaddr, BUFSIZE); //but 배열공간으로 공유메모리 데이터를 1024사이즈만큼 복사 puts(buf); //출력 shmdt(shmaddr); //공유메모리와 프로세서간 연결 종료 }
'Programming Language > C' 카테고리의 다른 글
scrncmp (0) | 2018.05.19 |
---|---|
strcpy(), strcat() (0) | 2018.05.13 |
int main(int argc, char *argv[]) (0) | 2018.05.13 |
call by reference (0) | 2018.03.28 |
댓글