PLT & GOT

2019. 8. 1. 11:10
728x90
728x90
728x90

PLT / Procedure Linkage Table

 실제 호출 코드를 담고 있는 테이블로서, 해당 내용을 참조하여 "_dl_runtime_resolve"가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 된다.

 

GOT / Global Offset Table

 PLT가 참조하는 테이블로서 프로시저들의 주소가 있다. PLT가 어떤 외부 프로시저를 호출할 때 이 GOT를 참조해서 해당 주소로 분기된다.

 

1. printf 함수 호출이 처음인 경우

 1) printf 함수 호출

 2) PLT 이동

 3) GOT 참조

 4) PLT 이동

 5) _dl_runtime_resolve 수행

 6) GOT에 실제 주소 저장 후, 실제 함수 주소로 점프

 

2. printf 함수 호출이 처음이 아닌 경우

 1) printf 함수 호출

 2) PLT 이동

 3) GOT 참조

 4) printf 함수로 점프

 

 

[사진 1]

테스트 파일은 위와 같다.

 

 

[사진 2]

컴파일된 파일을 readelf 명령어로 -S 옵션을 주면 섹션정보를 볼 수 있다.

 

 

[사진 3]

main 함수의 어셈블리어 코드는 위와 같다.

 

 

[사진 4]

먼저 printf 함수가 한 번도 수행되기 전에 호출되는 주소 0x8048308(PLT 영역)에서 3개의 명령어를 보면 다음과 같다.

1. 0x08049ac로 점프한다. / GOT 참조

2. 0x0804830e 주소로 점프한다. / 처음 호출되었기 때문에 실제 주소가 없다.

3. 0x080482c8 주소로 점프한다. / _dl_runtime_resolve 수행

마지막으로 GOT에 실제 주소 저장 후, 해당 주소로 점프한다.

 

 

[사진 5]

두 번째 printf 함수를 살펴보기 위해 첫 번째 printf 함수가 종료직후에 브레이크 포인트를 설정하고 실행한다. 그리고 다시 호출되는 주소 0x8048308(PLT 영역)에서 3개의 명령어를 보면 다음과 같다.

1. 0x080494ac 주소로 점프한다. / GOT 참조

2. 0x4006604c 주소로 점프한다. / printf 함수로 점프한다.

728x90
728x90

+ Recent posts