Programming Language/C

공유메모리 dump

D4tai1 2018. 5. 20.

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

댓글