LEVEL 10
[level10] passcode : interesting to hack!
interesting to hack!
(NO DRAG, NO PASSCODE)
이전까지의 레벨과는 다르게 program이란 디렉토리가 추가되었다.
그러나 program이라는 디렉토리는 접근 권한이 없다.
hint를 살펴보았더니 공유 메모리를 사용하는 두 사람의 대화를 도청하여 level11의 권한을 얻는 문제이다.
공유 메모리에 대하여 알아야 할 것 같다.
[ 공유 메모리 ]
- 원래는 프로세서가 사용하는 메모리 공간은 하나의 프로세스만이 사용할 수 있다.
- 다른 프로세스의 접근을 원하는 경우 최초의 공유 메모리 생성 프로세스가 커널에 공유 메모리 공간의 할당을 요청함으로써 이루어진다.
- 시스템 재부팅 및 공유 메모리 공간 삭제가 아니면 지속된다.
[ 공유 메모리 관련 함수 ]
-
int shmget(key_t key, int size, int shmflg)
- 공유 메모리 생성 함수
- key_t key : 공유메모리 구별 키값
- size : 공유 메모리 크기
- shmflg : IPC_CREATE(퍼미션 0666 설정, key에 해당하는 메모리 공간이 없으면 생성) / IPC_EXCL(공유 메모리가 존재한다면 접근을 차단)
- return 값 : shmid의 int 형
-
shmat(int shmid, const void *shmaddr, int shmflg)
- 공유 메모리를 프로세스에 첨부
- shmid : shmget 함수에 의하여 반환된 식별자 값
- const void *shmaddr : 공유 메모리의 주소, 특별한 사항이 없는 한 NULL
- shmflg : 동작 옵션, SHM_RDONLY(공유 메모리를 읽기 전용으로 설정) / SHM_RND(shmaddr ≠ NULL 일 때 → shmaddr을 반올림하여 메모리 경계에 맞춤)
이제 공유 메모리에 대하여 알아봤으니 대화 내용을 얻는 코드를 짜보자.
#include <stdio.h>
#include <sys/shm.h> //공유 메모리 관련 헤더
#include <sys/ipc.h> //공유 메모리 관련 헤더
int main()
{
int id; //shmget 함수의 반환값이 정수형이므로 int로 선언
char *ad; //shmat 함수의 반환값이 주소이므로 포인터로 선언
id = shmget(7530, 1024, IPC_CREAT|0666); //key_t값이 7530
ad = shmat(id, 0, SHM_RDONLY);
printf("%s", ad); //공유 메모리 안의 내용을 출력
return 0;
}
만들어진 코드로 level10 실행 프로그램을 컴파일 후 실행한다.
성공적으로 level11의 passcode를 얻었다.
[level11] : what!@#$?
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level12 [Buffer Overflow 𝜷] (0) | 2020.08.28 |
---|---|
FTZ - level11 [Buffer Overflow 𝛼] (0) | 2020.08.28 |
FTZ - level9 [Buffer Overflow] (0) | 2020.08.28 |
FTZ - level8 [John The Ripper] (0) | 2020.01.01 |
FTZ - level7 [ASCII] (0) | 2019.12.31 |