이 글은 아래의 블로그 원문을 참조하여 공부한 글 입니다.
bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/
PLT와 GOT 자세히 알기 1
Dynamic Linking 과정을 추적해 PLT와 GOT를 이해해보자 :) 시스템 해킹을 공부하시는 분들이라면 PLT와 GOT에 대해 알고 있을 것입니다. 이제 막 시스템 해킹 공부를 시작한 분들도 한 번 쯤 들어보셨을
bpsecblog.wordpress.com
PLT는 Procedure Linkage Table의 약자로 외부 프로시저를 연결해주는 테이블이다. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출하여 사용할 수 있다.
GOT은 Global Offset Table의 약자로 PLT가 참조하는 테이블로 프로시저들의 주소가 들어 있다.
함수를 호출한다는 것은 PLT를 호출한다는 의미이며 GOT으로 점프한다.
GOT에는 함수의 실제 주소가 있다. GOT에 실제 함수 주소가 있다면 GOT을 바로 호출하지 왜 PLT를 거치는 것일까?
이 이유를 알기 위해서는 링커(Linker)를 알아야 한다.
printf라는 함수를 사용하려면 소스 안에는 printf를 호출하는 코드가 있고, include 한 헤더파일 안에는 printf에 대한 선언이 있다.
소스 파일을 실행파일로 만들기 위해서는 컴파일 과정을 거쳐야 한다. 컴파일을 하면 오브젝트 파일이 생성된다. 오브젝트 파일은 printf 함수의 구현 코드를 모르기 때문에(선언이 다른 헤더 파일에서 되어있기 때문) 실행은 할 수 없다. 오브젝트 파일을 실행 가능하게 만드려면 printf의 실행 코드를 찾아서 오브젝트 파일과 연결시켜야 한다. printf의 실행코드는 printf의 구현 코드를 컴파일한 오브젝트 파일이며 이러한 오브젝트 파일들이 모여있는것을 라이브러리라 한다. 이렇게 소스 코드를 컴파일한 오브젝트 파일과 필요한 라이브러리를 연결시키는 작업을 링킹 이라고 한다.
링크를 하는 방법에는 Static과 Dynamic 방식이 있다. Static Link 방식은 파일 생성시 라이브러리 내용을 포함한 실행 파일을 만든다. gcc에서 -static 옵션을 적용하여 컴파일하면 Static Link 방식으로 컴파일 할 수 있다. Static Link 방식은 실행파일 안에 모든 코드가 포함되서 라이브러리 연동 과정이 따로 필요 없고, 필요한 라이브러리를 따로 관리 하지 않아도 되는 장점이 있지만, 파일 크기가 커지고, 동일한 라이브러리를 사용하더라도 해당 하이브러리를 사용하는 모든 프로그램들의 라이브러리의 내용을 모두 매핑시켜야 한다는 단점이 있다.
Dynamic Link방식은 공유 라이브러리를 사용하여 라이브러리 하나를 메모리 공간에 매핑하고 여러 프로그램에서 공유하여 사용한다. 실행파일안에 라이브러리 코드가 없으므로 파일 크기가 비교적 작아지고, 실행시에도 적은 메모리를 차지한다. 또한 라이브러리를 따로 업데이트 할 수 있기 때문에 유연한 방식이다. 하지만 실행파일이 라이브러리에 의존해야 하기 때문에 라이브러리가 없으면 실행할 수 없다.
링크 방식은 file 명령어를 통해 확인할 수 있다.
Dynamic Link 방식으로 컴파일 할 때 PLT와 GOT를 사용하게 된다. Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있어 함수의 주소를 알아오는 과정이 필요하다. 프로그램이 만들어지면 함수를 호출할 때 PLT를 참조한다. PLT는 GOT으로 점프하고, GOT에는 실제 함수의 주소가 쓰여 있어 이 함수를 호출한다.
이때 첫 호출이냐 아니냐에 따라 동작이 조금 달라진다.
두 번째 호출일 경우 GOT에 실제 함수의 주소가 쓰여있지만, 첫 번째 호출이면 GOT에 실제 함수의 주소가 쓰여있지 않다. 첫 번째 호출시는 Linker가 dl_resolve라는 함수를 사용하여 필요한 함수의 주소를 알아오고 GOT에 그 주소를 써준 후 해당 함수를 호출한다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C] C언어 코딩도장(14) (0) | 2021.03.23 |
---|---|
[Project H4C] C언어 코딩도장(13) (0) | 2021.03.23 |
[Project H4C] SFP, RET (0) | 2021.03.21 |
[Project H4C] Buffer Overflow (0) | 2021.03.21 |
[Project H4C] pwntools (0) | 2021.03.20 |