티스토리 뷰

pwnable/정리

PLT와 GOT

ba0bab 2018. 1. 7. 18:01




PLT와 GOT


Dynamic Link 방식으로 컴파일 했을 때 PLT 와 GOT를 사용하게 된다. 



Static Link 방식으로 컴파일 했을 시 라이브러리가 프로그램 내부에 있어 필요하지 않지만,

Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하다.



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

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



|"call printf@plt"| -> |.plt| ->(jmp got) |.got|


Dynamic Link 방식으로 프로그램이 만들어지면 함수를 호출 할 때 PLT를 참조하게 됨.

PLT에서는 GOT로 점프를 하는데, GOT에 라이브러리에 존재하는 실제 함수의 주소가 있어 함수를 호출하게 됨.


이 때, 첫 호출인지 아닌지에 따라 조금 다름.


두 번째 호출이면 GOT에 실제 함수 주소가 있겠지만 첫 번째 호출이라면 아님


그래서 첫 호출시에는 Linker가 dl_resolve라는 함수를 통해 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수로 호출 함.


Comments