본문 바로가기

PLT, GOT

@eouya22025. 6. 26. 11:46

 

PLT와 GOT는 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블이다.

사실 지금까지 오면서 gdb나 disassemble한 화면만 보더라도 puts@plt 이런식으로 되어있는걸 많이 봤다.

그래서 plt나 got, 그에 대한 개념이 궁금하긴 했는데, 이번 기회에 배우게 되었다.

PLT, GOT

PLT는 코드를 담고있고, GOT는 함수가 매핑된 실제 주소를 담고있는 테이블이라고 이해하면 쉽다.

 

우리가 바이너리를 실행하면, ASLR에 의해 라이브러리가 메모리 상 임의의 주소에 매핑 되는데, 이 때 함수를 호출하면 함수 이름을 기준으로 라이브러리에서 해당 함수에 대한 심볼을 탐색한다. 해당 함수에 대한 정의를 발견하면 해당 주소로 jmp, 실행하게 된다. 이 과정을 runtime resolve라고 한다. 그러나 반복적으로 호출되는 함수가 있을 경우, 호출할 때마다 매번 탐색하면 비 효율적이다.

 

ELF는 GOT라는 테이블을 두고 resolve된 함수의 주소를 해당 테이블에 저장하고, 나중에 다시 해당 함수를 호출할 시 GOT에 저장된 주소를 꺼내서 사용한다. 약간 캐시와 비슷한 개념이라고 할 수 있겠다.

 

포너의 관점 : PLT, GOT

PLT와 GOT는 동적링크된 바이너리에서 라이브러리 함수의 주소를 찾고 기록하는 중요한 테이블이다.

그러나 PLT에서 GOT를 참조하여 실행 흐름을 옮길 때 GOT의 값을 검증하지 않기 때문에, 취약점이 발생할 수 있다.

특정 라이브러리 함수의 GOT를 공격자가 임의로 수정이 가능하면 원하는 코드가 실행되도록 할 수 있다.

 

이러한 공격 기법을 GOT OverWrite 라고 부른다.

eouya2
@eouya2 :: eouya2

개인공부 기록 / 틀린거 있으면 돌팔매질 부탁드립니다

목차