Pwnable/FTZ

FTZ - level10 [Wiretapping]

Lucvs 2020. 8. 28. 12:49

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!@#$?