감자 텃밭

[시스템] PLT 와 GOT [초급] 본문

System/System Theory Information

[시스템] PLT 와 GOT [초급]

g2h 2021. 11. 19. 23:13

시스템 해킹(포너블)을 하다보면 PLT, GOT 어디선가 들어봤고,

plt, got 라고 불리우는것들을 막 호출하고 변조하고 할겁니다.

 

이번에는 이러한 plt와 got가 뭔지에 대해 알아보도록 하겠습니다.


보통 함수가 실행되면 plt 주소로 찾아가고 plt에는 got의 주소가 담겨져 있어 got를 참조하고

got에는 함수의 실제주소가 담겨져있다고들 설명한다 그럼 대체 왜 plt는 got를 참조하는거지? 바로쓰면 안되는건지

왜이렇게 왔다갔다 하는지 알아보도록 하겠습니다.

 

우선 PLT와 GOT의 의미부터 알아보도록 하겠습니다.


PLT : 외부 프로시저를 연결해주는 테이블.

GOT : PLT가 참조하는 테이블. 프로시저들의 주소가 들어있음.

 

여기서 프로시저란 무엇인가??

프로시저 : 매개변수는 존재하지만 반환값이 없는 함수, 특정 로직 처리 후 종료

프로그래머가 코드를 작성하였으면 해당 코드를 컴파일 하는 여러단계중 링킹이라는 단계를 거치게된다.

링킹이라는 과정이 이번 내용에서 중요한 내용이다


우선 링킹이란 특정 함수를 사용하기위해 헤더에 포함되어 있는 함수들을 불러와 오브젝트 파일과 연결한다.

이런 오브젝트들이 모여있는 파일들을 라이브러리라고 부른다.

이미지 인용 : https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

(오브젝트 파일은 사용자가 작성한 코드를 어셈블리어 코드로 변경된 파일)

 

링크를 하는 과정은 두 가지의 방식으로 나뉘게 된다.

Stack Link 와 Dynamic Link 방식이 존재한다.

 

Stack Link같은 경우는 헤더에 존재하는 모든 함수들의 구현코드를 실행파일 안에 포함하게된다.

이 경우 라이브러리와의 연동과정이 따로 없으며, 편하다는 장점이 존재하지만

모든 라이브러리들을 메모리에 매핑시켜야 하므로 파일의 크기가 커질 수 있다.

 

Dynamin Link 같은 경우는 헤더에 존재하는 함수들의 주소를 하나의 메모리 공간에 매핑하고 여러 프로그램에서

공유하게 된다. Stack Link보다 파일의 크기가 작아지며, 적은 메모리 용량을 차지하게 되고, 라이브러리를 업데이트

하는 등 유연하게 사용할 수 있다. 하지만 라이브러리(메모리 공간)에 함수가 존재하지않을 경우 실행 할 수 없는 의존성을 가지고 있다.

 

보통 아무런 옵션없이 컴파일시 Dynamin Link로 컴파일이 된다.

 

해당 Dynamin Link방식으로 컴파일 했을 경우 plt와 got를 사용하게 된다.

위에서 설명한 메모리 공간이 plt와 got가 된다. 

 

함수를 호출할때 plt를 참조하고 plt는 got를 참조하여 got에 쓰여 있는 실제함수 주소를 호출하게된다.

하지만 이는 함수가 두번 째 호출될 때의 과정이다.

 

함수가 처음 호출 될 때에는 여러 복잡한 과정을 거치게 된다.

(해당 상세 과정은 따로 다루도록 하겠다.)

 

첫 호출시 Link가 dl_resolve라는 함수를 사용하여 사용자가 필요로하는 함수의 실제주소를 알아오고

got에 알아온 함수의 주소를 저장하게 된다.

위 사진과 같이 함수를 호출하게되면 plt에서는 got로 jmp 하고 got에 주소가 기록되어 있지 않을 경우

dl_resolve함수를 통해 함수의 실제 주소를 가져온다 실제 과정은 더 많은 과정을 거치며 복잡하지만 이번정리에서는

plt와 got 동작과정이 대략적인 부분만 설명하겠다.

 

이를 통해 첫번 째 호출이 끝나고 두번 째 호출 부터는 함수가 호출되면 plt를 참조하고 plt에서는 got를 참조하여

첫번 째 과정을 통해 got에 저장되어있는 실제 함수의 주소를 참조하게 되는것이다.


참고자료
https://watchout31337.tistory.com/152
https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.

'System > System Theory Information' 카테고리의 다른 글

[시스템] libc-Database  (0) 2021.11.21
[시스템] 리틀 에디안 방식  (0) 2021.11.20
[시스템] epilogue [에필로그 과정]  (1) 2021.11.18
[시스템] Prologue [프롤로그 과정]  (0) 2021.11.18
Stack Frame ?  (0) 2021.11.15