PLT(Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.

 

GOT(Global Offset Table) : PLT가 참조할 때 사용하는 테이블 프로시저들의 주소들이 들어 있다.

 

-Procedure란 함수와 비슷한 개념이지만 함수는 리턴값이 있지만 프로시저는 리턴 값이 없다.

 

어떤식으로 사용되는가?

C언어에서 printf, system 같은 외부라이브러리 함수를 사용하기 위해 PLT가 호출되면 PLT는 외부 프로시저(다른 라이브러리에 있는 함수)를 호출하기 위해 프로시저들의 주소가 있는 GOT를 참조한다.

 

C system함수 사용요망 -> PLT 호출 -> GOT참조 -> 프로시저들의 주소(함수의 주소)

 

사실 함수를 처음 호출 할 경우 GOT는 함수의 주소를 가지고 있지 않기에 일련의 과정을 거쳐 주소를 알아낸다.

두번 째 호출 부터는 알아낸 함수 주소로 바로 jmp 한다.

 

PLT와 GOT에 있어 중요한 링커에 대해 설명하겠다.

 

어떤 코드를 작성한다고 예를 들었을때 코드를 짰다고 해서 이게 실행이 되는것이 아니다.

컴파일이라는 과정을 거쳐야 실행이 된다.

 

컴파일을 통해 오브젝트 파일을 생성한다.(오브젝트 파일 자체로는 실행 불가)

외부에서 불러온 함수(ex : system, printf)의 구현 코드를 모르기 때문에 실행 불가능하다.

이를 해결하기 위해서 함수의 실행 코드를 오브젝트 파일과 연결해 줘야 한다.

함수의 실행 코드는 함수의 구현 코드를 컴파일 한 오브젝트 파일, 즉 라이브러리에 존재한다.

이 라이브러리를 오브젝트 파일과 연결해 주는 링킹 작업이 필요 한데 여기에는 2가지 방법이 있다.

 

 

1. Static link

2. Dynamic link

 

static link 부터 알아보자

static은 정적이라는 뜻으로 앞서 설명한 라이브러리 파일을 내가 구현한 코드 와 함께 묶어서 만든 실행 파일이다.

실행 파일 안에 모든 코드가 포함 되기에 라이브러리 연동 과정이 필요 없지만 크기가 커지는 단점이 있다.

 

dynamic link는 동적 링크라는 뜻으로 라이브러리를 메모리 공간에 매핑하고 여러프로그램에서 공유해 사용하는 방식이다.

 

앞서 PLT&GOT에서 함수를 처음 호출 할 경우 GOT는 함수의 주소를 가지고 있지 않기에 일련의 과정을 거친다 하였다.

함수를 처음 호출 할 경우 Linker가 dl_resolve라는 함수를 사용해 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수를 호출한다.

 

참조 : https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/ 

'Basic Concepts > System' 카테고리의 다른 글

메모리 영역  (0) 2020.04.26
GOT Overwrite  (0) 2020.04.24
RTL(Return to libc) & chaining  (0) 2020.04.23
Fake EBP  (0) 2020.04.22
SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22

+ Recent posts