공유 메모리
■ 단원의 목적
공유 메모리(Shared Memory)에 데이터를 읽고 쓰기
: 하드코딩의 위험성 때문에
메모리에 데이터를 저장하기 시작했다.
메모리상에 올라가는 세션키를 통해 암복호화를 하는데..
■ 프로세스(Process)와 프로세스(Process)가 통신(메세지를 주고 받는 방법)
소켓 사용하는 경우(EX: Clint/Server 프로그램)
공유메모리를 사용하는 방법(EX: DB 프로그램(Oracle))
파일을 사용하는 경우
DB 사용하는 경우
기타
■ 보안적인 요소에서 공유메모리를 쓰고 있는 대표적인 경우
암호화/복호화 방식(핵심: key)
*잡식*
fd = file disk return
[level10@ftz level10]$ find / -type f -exec egrep -l /home/level10/program {} \; 2>/dev/null
[level10@ftz level10]$ ipcs
------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00001d6a 0 root 666 1028 0 0x00002328 98306 level9 666 1024 0
------ Semaphore Arrays -------- key semid owner perms nsems
------ Message Queues -------- key msqid owner perms used-bytes messages |
공유 메모리 관련 함수
shmget() 함수
공유 메모리를 생성하거나 공유 메모리를 사용할 수 있는 함수
-> 공유 메모리를 생성하거나 생성된 공유 메모리의 ID 반환
형식 : int shmget(key_t key, int size, int shmflg);
- key_t key : 공유 메모리를 읽기 위한 key 변수
- int size : 공유 메모리의 크기
- int shmflg : 공유 메모리 생성이나 사용 옵션을 지정
- IPC_CREAT : 공유 메모리 생성
- 0666 : 공유 메모리 사용 권한
반환 :
- 실패: -1
- 성공: -1 이외의 값, (공유 메모리 식별자)
예제:
int shm_id;
shm_id = shmget((key_t)7530, 1024, IPC_CREAT|0666);
if (shm_id == -1) 실패;
else 성공
■ shmat() 함수/shmdt() 함수
NAME
shmop - shared memory operations
SYNOPSIS
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
shmat() 함수
이미 할당된 공유 메모리 공간을 다른 프로세스에서 사용할 수 있게 권한을 부여하는 함수
-> 생성된 공유 메모리를 프로세스에 연결(Attach)
형식 : void *shmat(int shmid, const void *shmaddr, int shmflg);
- int shmid : 공유 메모리를 생성할 때 만들어진 공유 메모리 ID
- const void *shmaddr : 공유 메모리가 할당된 주소
- int shmflg : 공유 메모리 사용 옵션을 지정
- SHM_RND : 공유 메모리 주소를 프로세스에 맞게 따로 할당
- SHM_RDONLY : 공유 메모리를 읽기 전용으로 설정
반환:
(실패) (void *)-1 :
(성공) 프로세스 공유 메모리 접근 주소
예제:
int shm_id;
void *shm_addr=(void * )0;
shm_addr = shmat(shm_id, (void *)0, 0);
if (shm_addr == (void * )-1) 실패;
else 성공;
[참고] http://forum.falinux.com/zbxe/index.php?document_srl=426102&mid=C_LIB
shmdt() 함수
다른 프로세스에 연결된 공유 메모리 공간의 사용을 끝낸 후 프로세스와 공유 메모리 공간의 연결을 끊는다.
-> 프로세스에 연결된 공유 메모리를 분리(Detach)
형식 : int shmdt(const void *shmaddr);
- const void *shmaddr : 공유 메모리가 할당된 주소
* 공유 메모리(key_t 7530)에 접근하여 정보 읽는 프로그램 만들기
/* Header Files */
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
/* Global Variable */
/* Function */
/* Main Functtion */
int main(void)
{
int shm_id;
void *shm_addr = (void *)0;
char buf[1024];
// (1) Approach Memory address shmget
shm_id = shmget(7530, 1024, 0666);
// (2) to Approach to target shmat
shm_addr = shmat(shm_id, (void *)0, 0);
// (3) Copy memory memcpy
memcpy(buf, shm_addr, 1024);
printf("Content : %s\n", buf);
// (4) dettach shmdt
shmdt(shm_addr);
return 0;
}
프로그램 코드 작성시 작은 단위로 하나씩 만들어 나가야한다.
한 번에 다 만들려고 하지 말고 작은 단위 하나를 구현시키고
하나씩 확장해 나가면 된다.
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 DAY 69~71 : 리버싱 문제 풀기 (0) | 2020.12.17 |
---|---|
정보보안 과정 Day 68 : 리버싱 6 (FSB / BOF) (0) | 2020.12.14 |
정보보안 과정 Day 66-1 : 리버싱 4 (0) | 2020.12.09 |
정보보안 과정 Day 66 : 의사코드 복원 실습 (0) | 2020.12.09 |
정보보안 과정 Day65 : Reverse Engineering 3 (0) | 2020.12.08 |