일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 인공지능
- 신경망파이썬
- 딥러닝파이썬
- 머신러닝
- C알고리즘
- 보안
- 정보보안
- 파이썬신경망
- 활성화함수파이썬
- 버퍼오버플로우
- 항등함수
- BOF
- c언어
- 백준알고리즘
- 알고리즘
- BOJ
- 딥러닝
- C언어알고리즘
- 스트림암호
- 밑바닥부터시작하는딥러닝
- 신경망 학습
- C언어 알고리즘
- 신경망
- 신경망구현
- FTZlevel10
- 파이썬
- 소프트맥스함수
- 8086CPU레지스터
- 백준
- 달고나bof
- Today
- Total
HeeJ's
[10] hackerschool FTZ :: level10 본문
공유메모리?
프로세스는 자신의 업무를 수행하기 위해 필요한 자료를 저장하기 위한 메모리 공간을 갖게 된다. 이러한 메모리 공간에는 CPU에 의해 수행되는 명령어들, 프로그램 시작 시 정의되고 초기화된 데이터, 프로그램 시작 시 정의되었지만 포기화되지 않은 데이터, 함수호출에 필요한 정보, 동적할당이 이루어지는 데이터 등이 들어가게 된다.
이러한 데이터를 저장하게 사용하기 위한 메모리 공간을 커널에 요구해 할당받아 사용하게 되는데, 이러한 메모리 공간은 기본적으로 메모리를 요청한 프로세스만이 접근가능하도록 되어있다. 하지만 가끔은 여러개의 프로세스가 특정 메모리 공간을 동시에 접근해야할 필요가 있을 때가 있다.
공유 메모리는 이러한 작업을 위한 효율적인 방법을 제공한다.
공유 메모리는 여러 IPC 중에서 가장 빠른 수행 속도를 보여준다.
그 이유는 하나의 메모릴르 공유해 접근하게 되므로, 데이터 복사와 같은 불필요한 오버헤드가 발생하지 않기 때문으로, 빠른 데이터의 이용이 가능하다. 그러나 하나의 프로세스가 메모리에 접근 중에 있을 때, 또 다른 프로세스가 메모리에 접근하는 일이 발생하면 자칫 데이터가 훼손될 수 있을 것이므로, 한 번에 하나의 프로세스가 메모리에 접근하고 있다는 것을 보증해줄 수 있어야 할 것이다.
공유 메모리에 관련된 함수들
#include <sys/types.h>
#include <sys/shm.h>
int shmget(key_t, int size, int shmflg)
void *shmat(int shmid, const void *shmaddr, int shmflg)
int shmdt(const void *shmaddr)
int shmct1(int shmid, int cmd, struct shmod_ds *buf)
공유 메모리의 생성 요청은 최초 공유 메모리 영역을 만드는 프로세스가 커널에 공유 메모리 공간의 할당을 요청함으로써 이루어지며 만들어진 공유 메모레는 커널에 의해 관리되게 된다.
이렇게 만들어진 공유 메모리는 운영체제를 리부팅하거나, 직접 공유 메모리 공간을 삭제시켜주지 않은 한, 공유메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도, 계속적으로 유지되게 된다.
프로세스가 커널에게 공유메모리 공간을 요청하게 되면, 커널은 공유 메모리 공간을 할당시켜주고 이들 공유 메모리 공간을 관리하기 위한 내부자료구조를 통하여, 이들 공유 메모리를 관리하게 된다.
만약 새로운 영역애 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가 정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다.
//shmid_ds 구조체
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
time_t shm_atime; /* last attach time */
time_t shm_dtime; /*last detach time */
time_t shm_ctime; /*last change time */
unsigned short shm_cpid; /*pid of creator */
unsigned short shm_lpid; /* pid of last operator */
short shm_nattch; /*no. of current attaches */
};
struct ipc_perm {
key_t key;
ushort uid; /* owner euid and egid */
ushort gid;
ushort cuid; /* creator euid and egid */
ushort cgid;
ushort mode; /* lower 9 bits of shmflg */
ushort seq; /* sequence number */
};
만약 공유 메모리 영역이 이미 존재한다면 접근 권한은 수정된다.
shm_perm | 공유 메모리는 여러개의 프로세스가 동시에 접근 가능하므로, 파일과 같이 그 접근권한을 분명히 명시해줘야 한다. |
shm_segsz | 할당된 메모리의 byte 크기이다. |
shm_atime | 가장 최근의 프로세스가 세그먼크를 attact한 시간 |
shm_dtime | 가장 최근의 프로세스가 세그먼트를 detach한 시간 |
shm_ctime | 마지막으로 이 구조체가 변경된 시간 |
shm_cpid | 이 구조체를 생성한 프로세스의 pid |
shm_lpid | 마지막으로 작동을 수행한 프로세스의 pid |
shm_nattch | 현재 접근중인 프로세스의 수 |
ipcs를 통해 OS에서 프로그램이 사용하는 IPC, 공유메모리, 세마포어 현황을 파악할 수 있다.
key가 0x00001d6a, 10진수로 7530이 된다.
tmp 폴더로 이동해 코드를 작성해준다.
코드를 실행시켜주면 패스워드를 얻을 수 있다.
[출처]
1. https://unabated.tistory.com/entry/%EA%B3%B5%EC%9C%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC-shared-memory
2. https://www.joinc.co.kr/w/man/2/shmget
'<CTF> > <HackerSchool FTZ>' 카테고리의 다른 글
[09] hackerschool FTZ :: level9 (0) | 2020.08.15 |
---|---|
[08] hackerschool FTZ :: level8 (0) | 2020.08.13 |
[07] hackerschool FTZ :: level7 (0) | 2020.08.13 |
[06] hackerschool FTZ :: level6 (0) | 2020.08.01 |
[05] hackerschool FTZ :: level5 (0) | 2020.08.01 |