심볼링 링크 VS 하드링크
심볼링 링크와 하드 링크를 이해하기 위해서 우선 inode의 개념을 알아야 한다.
리눅스 운영체제에서는 사용자가 디스크에 위치에 있는 파일을 커널을 통하여 접근하게 된다. 이를 위해서 커널 내에는 현재 사용중인 파일에 대한 중요 정보를 갖고 있는데, 커널 내에서 파일 시스템과 관련하여 중요한 정보 중 하나가 바로 inode이다.
파일이나 디렉토리는 그에 해당하는 하나의 inode를 가지고 있으며, 이 inode에는 해당 파일에 대한 모든 정보를 가지고 있다. 또한 이 inode를 가지고 있는 표를 inode 표라고 한다.
어떤 한 파일이나 디렉터리가 생성되면 하나의 inode가 생성이 되고, inod-리스트에 등록이된다. 그리고 등록되는 번호를 inumber라고 한다.
그림 1
사용자가 현재 디렉토리 안에 파일을 하나 생성했다고 가정해보자.
주황색 데이터가 생성한 데이터이고 위에서 설명한대로 해당 주황색 파일에 대한 정보가 담겨져있는 inode 가 생성된다.
inode에는 실제 생성한 파일이 실제 디스크 어디에 위치하는지 알수 있는 정보가 있다.
하드 링크란와 심볼링 링크는 둘다 윈도우에서 바로가기와 같은 의미로 생각하면 쉽다.
맨 아래에 있는 " 링크관련.PNG - 바로가기 " 파일이 바로 윈도우에서 생성한 바로가기 파일이다.
이와 같은 바로가기 개념을 기초로하여 링크는 하드링크와 심볼링 링크로 나뉜다.
1. 하드링크
하드링크 파일은 그림1에서 검은색 파일을 나타내게 된다. 원본파일을 생성했을 때 inode가 생성된다고 했는데 하드링크는 바로 원본 데이터가 가지고 있는 inode를 가리키게 된다. 즉 하나의 inode를 원본 파일과 하드링크 파일이 동시에 포인팅한다는 소리이다.
하드 링크
따라서 위 그림처럼 원본데이터를 삭제해도 원본 파일의 inode를 가리키는 하드링크 파일을 통해 여전히 a파일의 접근이 가능하다.
2. 심볼릭 링크
심볼릭 링크는 하드링크와 다르게 다음과 같은 구성을 이루고 있다.
심볼릭 링크
a 파일의 심볼링 링크는 기존 inode1 을 가리키는게 아니라 새로운 inode2 를 생성하고 이 것은 또 원본 a데이터를 포인터로 가리키고 있다.
따라서 만약 a파일을 삭제하게 되면 a 심볼릭 링크 파일의 포인터는 가리키는 대상을 잃어버리게 되므로 기존 파일을 하드링크저럼 접근하지 못한다.
이제 문제를 통해 해당 개념을 확인하도록 하자.
해커스쿨 ftz 5번 문제를 보면 다음과 같다.
다음은 level5 문제를 풀기위한 힌트이다. 우선 ls -l /usr/bin/level5 명령어를 통해 해당 파일대한 정보를 확인하자.
-rws--x--- 1 level6 level5 12236 Sep 10 2011 /usr/bin/level5
소유자 권한 부분이 rws 이고 소유자는 level6 이다. 이를 통해 해당 파일을 실행하면 level6의 권한을 임시적으로 빌려올수 있다는 것을 알수 있다.
이 파일을을 실행하면 /tmp 디렉토리에 level5.tmp 라는 임시파일을 생성한다고 해서 실행을 해봤는데 아무리 봐도 /tmp 디렉토리에 저런 임시파일을 찾을 수 없었다.
이는 아마도 관리자 나 level6 사용자가 해당 임시파일을 만들고 바로 삭제한다고 유추할 수 있다.
따라서 임의로 파일을 하나와 level5.tmp 파일을 만들었다.
그 후에 하드링크를 통해 level5.tmp로 링크를 걸어주면 level5.tmp 파일이 생성 후 바로 삭제되더라도 임의로 만든 level5.tmp에 연결된 하드링크의 특성으로 인해 내가 만든 파일이 아닌 원래 생성되는 level5.tmp에 저장되어 있던 내용을 확인할 수 있다.
** 원래 그냥 /usr/bin/level5를 실행하면 /tmp 에 level5.tmp가 생성 후 삭제됬는지 안보엿는데 임의로 level5.tmp를 만들고 위 과정을 수행하면 level5.tmp 파일이 삭제가 안된다.
이는 아마도 해당 /usr/bin/level5 프로그램이 level5.tmp 파일이 없으면 새로 만들고 바로 지우지만, 만약 존재한다면 삭제하지 않는 것 같다.
'보안 > Linux' 카테고리의 다른 글
Heap 기초1 (2) | 2020.04.12 |
---|---|
2019 코드게이트 해킹 시연 공모전 (0) | 2019.06.06 |
리눅스 디렉토리 구조 (0) | 2019.03.22 |
리눅스 쉘이란? (0) | 2019.03.22 |
리눅스 특수권한이란? (0) | 2019.03.22 |