시스템/시스템 보안

[문제 풀이로 배우는 시스템 해킹 테크닉] level10.공유 메모리에 데이터 읽고 쓰기

비니화이팅 2017. 12. 6. 14:13

이번 레벨의 문제를 풀기 전에 공유 메모리라는 것을 먼저 알아야 한다.


공유 메모리란 프로세스간에 공유해서 쓰는 메모리를 말한다.


프로세스는 각자 자신만이 사용할 메모리 공간을 할당해서 사용하기 때문에 다른 프로세스에서 사용하는 메모리 공간은 침범할 수 없도록 설계돼있다.

그러나 프로세스 간 서로 데이터를 공유해야 하는 필요성 때문에 IPC라는 기법이 생겨났다.


큰 프로그램은 하나의 프로세스로 모든 사하을 구현하기 힘들기 때문에 여러 개의 프로세스로 기능을 분리해서 만들게 되는데 이렇게 기능을 분리하였기 때문에 서로 다른 프로세스 간에도 데이터를 공유해야 할 필요성이 있다.

즉, 공유 메모리는 프로그램을 개발할 때 함수로 각종 기능을 분리하고 함수 간에 인자로 데이터를 전달하는 것과 개념상 비슷하며 프로그램의 복잡도가 훨씬 높은 큰 프로세스 간에 데이터를 주고 받는 개념으로 이해하면 된다.


프로세스A가 접근하는 데 필요한 조건을 설정해서 공유 메모리 공간을 만들고 프로세스B~N 등 다른 프로세스에서 접근하는 데 필요한 정보를 이용하여 공유 메모리 공간을 함께 사용한다.


먼저 힌트를 확인해본다.


level10계정의 홈 디렉터리의 내용을 보면 이전 레벨엔 없었던 program이라는 디렉터리가 보인다.

root 소유이기 때문에 내용을 볼 수 없다.


level10이 소유자인 파일을 검색해봤지만 파일이 검색되지 않는다.


이런 경우에는 프로그램을 시스템이 시작될 때 자동으로 시작되도록 등록하는 설정에 해당 파일이 있을 수 있으므로 rc.local파일을 확인해본다.

위와 같이 /home/level10/program디렉터리에 실행파일이 있다.

그러나 root권한이므로 접근할 수 없다.


level10이라는 이름으로 실행중인 프로세스가 있는지도 확인해본다.

level10으로 실행중인 프로세스는 없다.


이제 힌트를 참고하여 공유메모리에 키 값으로 접근하는 소스코드를 작성한다.

   

14: 공유 메모리의 ID를 읽어온다.

15: 프로세스에서 공유 메모리 공간을 사용할 수 있도록 연결한다.

16: 공유 메모리 공간에 있는 값을 특정 변수에 복사한다.

17: 복사한 값을 출력한다.

18: 프로세스에서 공유 메모리의 연결을 분리한다.


이를 실행시키면 패스워드를 얻을 수 있다.