level 10
(password : interesting to hack!)
'ls'을 통해 'hint '파일이 존재하는 것을 확인한 후, 'cat' 명령어를 통해 내용을 확인하였다.
'공유 메모리'를 이용하였고, 공유 메모리 식별 번호인 'key_t = 7530' 라는 정보를 통해 level11의 권한을 얻는 문제이다.
즉, '7530' 위치에 접근하는 소스코드를 작성해야 한다.
'공유 메모리'는 프로세스 간에 공유해서 쓰는 메모리를 의미한다. '공유 메모리'는 공유 메모리를 사용할 프로세서 중 하나가 조건을 설정해 공유 메모리를 만들고, 그 외의 프로세서가 필요한 정보를 이용해 공유 메모리를 같이 사용하는 것이다.
※ 공유 메모리 설정할 때 쓰이는 함수
1. shmget()
- 공유 메모리를 생성하는 함수
- int shmget(key_t key, int size, int shmflg)
- key_t key : 공유메모리를 구별하는 key값이다.
- int size : 공유메모리 크기를 결정한다.
- int shmflg : 여러가지 옵션을 추가할 수 있다.
- IPC_CREATE : 퍼미션 0666을 설정한다. 첫번째인수 key에 해당하는 메모리가 없으면 공유메모리를 생성한다.
- IPC_EXCL : 공유메모리가 있으면 실패로 반환하고 접근하지못하게 한다.
- 공유메모리의 shmid를 int형으로 리턴하고 실패시에는 -1 이 리턴된다.
2. shmat()
- 프로세서에 공유 메모리 세그먼트를 붙여주는 함수
- void *shmat(int shmid, const void *shmaddr, int shmflg)
- int shmid : shmget 함수에 의해 반환된 int형의 식별자이다.
- const void *shmaddr : 일반적으로 NULL 지정. 커널에 매핑되지않은 곳을 자동으로 찾아서 붙여준다.
- int shmflg : 여러가지 옵션을 추가할 수 있다.
- SHM_RDONLY : 공유메모리를 읽기전용으로 설정한다.
- SHM_RND : shmaddr 이 NULL이 아닐경우에만 쓴다. shmaddr을 반올림하여 메모리경계에 맞춘다.
- 이 함수는 shmid에 대한 주소를 리턴해주고 , 실패시 -1이 리턴된다.
3. shmdt()
- 프로세서에서 공유 메모리를 분리하는 함수
- int shmdt(const void *shmaddr)
- const void *shmaddr : 분리할 공유메모리 주소다.
- 이 함수는 성공시0 을 , 실패시 -1 을 반환해준다.
위의 함수들을 참고해서 공격 코드를 작성하였다.
먼저 'cd' 를 통해 'tmp'로 이동하였다.
그리고 나서 위에 적어둔 공유 메모리 함수를 참고하여 공격 코드인 'level10.c' 를 생성하였다.
코드의 내용은
1. 공유 메모리를 생성하고 해당 메모리에 값을 쓴다.
2. 프로세서에서 공유 메모리를 사용할 수 ㄴㄴㄴ있도록 연결한다.
3. 공유 메모리 공간에 있는 값을 특정 변수인 'buf'에 복사한다.
4. 공유 메모리 공간의 값을 담은 'buf' 변수를 출력한다.
5. 프로세서에서 공유 메모리의 연결을 분리한다.
생성한 'level10.c' 를 'gcc -o' 를 통해 컴파일하였다.
파일 'level10' 을 실행하면, 우리가 원하는 'level11'의 패스워드 값이 'what!@#$?' 인 것을 얻을 수 있다.
'Systemhacking > FTZ' 카테고리의 다른 글
[FTZ] level12 (0) | 2021.05.23 |
---|---|
[FTZ] level 11 (0) | 2021.05.17 |
[FTZ] level9 (0) | 2021.05.06 |
[FTZ] level6 (0) | 2021.03.30 |
[FTZ] level5 (0) | 2021.03.30 |