FTZ_level10
[level10@ftz level10]$ cat hint
두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다. 그 대화방은 공유 메모리를 이용하여 만들어졌으며, key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여 level11의 권한을 얻어라.
- 레벨을 완료하셨다면 소스는 지우고 나가주세요.
|
이 문제를 풀려면 공유 메모리에 대한 개념이 필요합니다.
공유 메모리란 여러 프로세스가 공유하는 메모리 공간.. 입니다.
예를 들면 A라는 프로세스와 B라는 프로세스가 공유 메모리를 사용할 때,
A와 B 프로세스는 각각의 메모리 공간을 가지고, 두 프로세스가 모두 사용할 수 있는 공유 메모리를 가집니다.
공유 메모리를 사용하는 프로세스들은 해당 메모리에 접근할 수 있으므로
A와 B의 공유 메모리를 사용하는 C 프로세스를 만들면, 공유 메모리에 접근할 수 있겠네요ㅎㅎ
그럼 key_t값이 7530인 공유메모리를 가진 프로세스를 만들어볼까요??
우선은 공유 메모리에 대해 더 찾아보겠습니다.
좋은 자료가 있어서 첨부했습니다~~
***공유메모리생성_ shmget()*** 공유메모리는 단어 뜻에서 알 수 있듯이 하나의 프로세스에서가 아니라 여러 프로세스가 함께 사용하는 메모리를 말한다. 이 공유 메모리를 이용하면 프로세스끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있다. 이렇게 같은 메모리 영역을 공유하기 위해서는 공유메모리를 생성한 후 프로세스의 자신의 영역에 첨부를 한 후에 마치 자신의 메모리를 사용하듯 사용한다.
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int shmflg);
key_t key : 공유 메모리를 구별하는 식별 번호 int size : 공유 메모리 크기 int shmflg : 동작 옵션 IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다. 만약있다면 무시하며 생성을 위해 접근 권한을 지정해 주어야 한다. IPC_EXCL : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다. 이 옵션이 없어야 기존 공유 메모리에 접근할 수 있다. 반환 -1 : 실패 -1 이외 : 공유 메모리 생성 성공, 공유 메모리 식별자
***공유 메모리를 프로세스에 첨부_shmat()*** #include <sys/type.h> #include <sys/shm.h> void *shmat(int shmid, const void* shmaddr, int shmflg);
int shmid : 공유 메모리를 구별하는 식별번호 void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL을 지정 int shmflg : 동작옵션 SHM_RDONLY : 공유 메모리를 읽기 전용으로 SHM_RND : shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여 메모리 페이지 경계에 맞춘다. 반환 (void *)-1 : 실패 이외 : 프로세스에 첨부된 프로세스에서의 공유 메모리 주소
***공유 메모리를 분리_shmdt()*** #include <sys/type.h> #include <sys/shm.h> int shmdt(const void *shmaddr);
void *shmaddr : 분리할 공유 메모리 주소 반환 -1 : 실패 0 : 공유 메모리 분리 성공
[출처] http://blog.naver.com/nature128/130073681032
|
shmget 함수를 통해 공유 메모리를 생성하고
shmat 함수는 공유 메모리를 사용 가능하게 이어 붙이고
shmdt 함수는 공유 메모리를 분리시키는 역할을 한다고 합니다
이제 필요한 프로그램을 만들어 보겠습니다
[level10@ftz tmp]$ cat lvl10.c #include <sys/ipc.h> // <sys/type.h>가 포함?되지 않아 manual 참고했습니다 #include <sys/shm.h> #include <stdio.h>
int main(void) { int shmid = shmget(7530, 0, IPC_CREAT); // key값 7530
char *shmstr = shmat(shmid, NULL, SHM_RDONLY); // shmget 함수가 공유 메모리 세그먼트 식별자를 반환하므로 // 2번째 인자 값 NULL -> 시스템이 사용되지않은 적당한 메모리 영역 주소를 찾아줌 // SHM_RDONLY -> 읽기 전용
printf("%s\n", shmstr); } [level10@ftz tmp]$ ./lvl10 멍멍: level11의 패스워드는? 구타: what!@#$?
|
'System Hacking > 해커스쿨 FTZ' 카테고리의 다른 글
해커스쿨 FTZ ( level12 -> level13 ) by ORANG (0) | 2014.10.20 |
---|---|
해커스쿨 FTZ ( level11 -> level12 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level9 -> level10 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level8 -> level9 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level7 -> level8 ) by ORANG (0) | 2014.10.20 |