PLT ( procedure Linkage Table )
- 외부 프로시저를 연결해주는 테이블
- PLT를 통해 다른 라이브러리에 있는 프로시저를 호출하여 사용할 수 있다.
GOT ( Global Offset Table )
- PLT가 참조하는 테이블
- 프로시저들의 주소가 들어있다.
전반적인 PLT와 GOT의 흐름은 다음과 같이 정리된다.
함수 호출 ( PLT 호출 ) -> 함수의 실제 주소가 쓰여져있는 GOT로 점프 -> GOT 참조 -> 해당 함수로 점프
만일 , 첫 호출이라면 GOT는 함수의 주소를 가지고 있지 않고 일련의 과정을 통하여 주소를 알아낸다.
호출이 두번이상 반복되면 첫 호출때 알아낸 주소로 바로 점프한다.
이렇게 참조하는 과정에서 주소를 변조하여 우리는 프로그램의 흐름을 변경시킬수 있다.
예를들어 , RTL 기법의 경우 got안에 들어있는 호출하고자 하는 해당함수의 포인터주소를 system함수를 가리키도록 바꿔서 쉘을 획득할 수 있다.
이러한 PLT & GOT방식을 이용하는 이유
PLT와 GOT를 왜 사용하는가에 대하여 알기위해서는 링커의 개념이 필요하다.
링커란 , 말 그대로 연결의 기능을 갖고있으며 이는 오브젝트 파일과 해당 함수의 실행코드를 찾아서 연결시켜준다.
Link방법에는 Static과 Dynamic 방식이 존재하는데 PLT&GOT는 Dynamic방식과 관련되어져 있다.
Dynamic Link 방식으로 프로그램이 만들어지게 될 경우 , 함수 호출시 PLT를 참조하게 된다.
이 PLT는 GOT로 점프하게되고 , GOT에 라이브러리에 조재하는 실제 함수의 주소가 쓰여져있어서 해당 함수를 호출하게 된다.
(위에서 언급한 라이브러리는 공유 라이브러리로써 하나의 메모리 공간에 매핑하고 여러 프로그램에서 공유하여 사용한다. )
하지만 , 이 방법은 실행파일이 라이브러리에 의존해야 하기 떄문에 라이브러리가 없으면 실행또한 불가능하다.
( Dynamic Linker의 역할 : 호출할 함수 이름이 있는 메모리의 주소를 구하고 이를 이용해 최종적으로 공유라이브러리에 있는 실제 함수의 주소를 구해온다. )
'Hacking & Security > System' 카테고리의 다른 글
Cloud Computing (0) | 2019.11.20 |
---|---|
CyberPlatform Security #1 (0) | 2019.11.18 |
Linux 환경에서의 메모리 보호기법 (0) | 2018.08.21 |
환경변수란 ? (0) | 2018.01.30 |
Buffer Overflow Basic 3 (0) | 2018.01.16 |