PLT와 GOT

2021. 7. 17. 17:43Layer7/Pwnable

728x90

- PLT란?

 

PLT는 *Procedure Linkage Table의 약자입니다.

파일 내부가 아닌 다른 외부 *라이브러리의 함수를 호출할 때 연결을 해주는 테이블입니다.

 

리턴 값이 없는 함수

* 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임

 

이렇게 정의만 말하면 조금 어렵게 느껴질 수도 있습니다.

추가적인 설명과 함께 예시를 들어보겠습니다.

 

우선 PLT가 필요한 상황과 필요하지 않은 상황이 있습니다.

Dynamic Link를 할 때는 PLT가 필요하고, Static Link를 할 때는 PLT가 필요하지 않습니다.

그 이유는 무엇일까요?

 

Static Link는 Link 단계에서 라이브러리를 바이너리에 포함시킵니다.

그 말인 즉슨, 별도의 외부 파일이나 라이브러리가 없어도 실행 바이너리가 독립적으로 가동하며 라이브러리 함수들을 사용할 수 있게 된다는 뜻입니다.

 

물론 단점도 존재합니다.

실행 바이너리에 라이브러리가 포함되어있으니 코드가 길어짐과 동시에 컴파일 시간도 길어지게 됩니다.

 

그와 반대로 Dynamic Link는 Link 단계에서 라이브러리를 다른 메모리 공간에 집어넣고 필요할 때마다 꺼내서 씁니다.

만약 현재 내 코드의 Link 방식이 Dynamic Link인데 여분의 메모리 공간이 없다면 실행을 할 수 없습니다.

 

그럼 여기서 말하는 "여분의 메모리 공간"은 어디에 있는, 어떤 메모리 공간을 말하는 걸까요?

 

눈치채신 분들도 있겠지만 이 공간이 바로 PLT입니다.

 

 

- GOT란?

 

GOT는 Global *Offset Table의 약자입니다.

위에서 설명한 PLT가 참조하는 테이블이 GOT고, GOT에는 프로시저들의 주소가 담겨있습니다.

 

* 오브젝트의 첫 요소부터 주어진 요소나 지점까지의 변위 차를 나타내는 정수

 

아까 PLT는 외부 라이브러리 함수를 호출할 때 연결을 해주는 테이블이라고 했습니다.

PLT에는 실질적인 함수의 주소는 존재하지 않고 말 그대로 연결만 해주는 테이블입니다.

GOT에는 실제 함수의 주소가 쓰여있기 때문에 PLT는 GOT를 참조해야 함수를 실행할 수 있습니다.

 

그렇기에 Dynamic Linking을 할 때는 PLT와 GOT, 이렇게 두 테이블이 쓰입니다.

 

 

- PLT와 GOT의 쓰임새

 

그러면 이런 PLT와 GOT는 어디서 어떻게 쓰일까요?

우선 그림 한 장을 넣고 그에 맞춰 설명을 하도록 하겠습니다.

 

printf() 함수에서의 PLT와 GOT

이 사진, 제 글 어디에선가 본 적 있지 않으신가요?

 

사실 PLT와 GOT는 ELF 파일 구조에서 한 번 설명한 적이 있습니다.

저번에는 호출 구조가 어떻게 되는지만 간단하게 설명했지만, 이번에는 왜 그렇게 되는지까지 세세히 설명해보겠습니다.

 

이 그림은 printf() 함수를 실행하기 위해 이루어지는 과정을 간략하게 정리해놓은 그림입니다.

 

우선 "call printf@plt"라는 명령문을 실행합니다.

이 명령문을 실행하면 printf() 함수를 호출하게 되는데, 이때 PLT를 참조하게 됩니다.

 

PLT를 참조한다? 하면

"이 파일은 Dynamic Linking으로 만들어졌구나!"라고 생각하면 되겠습니다.

 

PLT를 참조하면 GOT로 점프를 하게 됩니다.

 

여기서 중요한 포인트가 있습니다.

현재 실행하려고 하는 함수를 호출할 때, 첫 호출이냐 아니냐에 따라서 동작 과정이 달라집니다.

 

첫 번째 호출이라면 GOT에 함수의 실제 주소가 쓰여있지 않습니다.

첫 호출 시에는 Linker가 dl_resolve() 함수를 사용하여 실행하려는 함수의 주소를 얻어옵니다.

그리고 얻어온 주소를 GOT에 써주고 함수를 실행하게 됩니다.

 

따라서 첫 번째 호출이 아닌 경우에는 GOT에 이미 해당 함수의 실제 주소가 쓰여있는 상태입니다.

그렇기에 dl_resolve() 함수를 사용하지 않고 바로 함수를 호출하게 됩니다.

728x90

'Layer7 > Pwnable' 카테고리의 다른 글

FSB 문제 풀이 (2)  (0) 2021.08.03
FSB 문제 풀이 (1)  (0) 2021.08.01
여러가지 ROP 문제 풀이  (0) 2021.08.01
Pwndbg 동적 디버깅으로 RTL 32bit, RTL 64bit 풀기 - Ubuntu Linux  (0) 2021.07.19