Systemhacking/FTZ

[FTZ] level10

レ(゚∀゚;)ヘ=З=З=З 2021. 5. 17. 01:19
728x90

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