라이브러리(Library)
PLT, GOT를 이야기하기 앞서 라이브러리에 대해 알아보자.
라이브러리에는 자주 사용하는 혹은 성질이 비슷한 계열의 함수들이 모여있다.
라이브러리를 활용해서 사용자는 함수를 정의할 필요 없이 원하는 함수를 가져다 쓸 수 있다.
라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 나뉜다.
링크(Link)
라이브러리는 링크라는 과정을 통해 소스 코드와 연결된다.
리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF형식을 갖춘 오브젝트 파일(Object file)로 번역된다.
오브젝트 파일은 실행 가능한 형식을 갖추고 있지만 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능하다.
링크 과정을 통해 라이브러리에 정의된 심볼과 관련된 정보들을 찾아서 최종 실행 파일에 기록하게 되고 사용할 수 있게 된다.
동적 라이브러리를 링크하면 동적 링크, 정적 라이브러리를 링크하면 정적 링크이다.
동적 링크된 바이너리를 실행하면 동적 라이브러리가 프로세스의 메모리에 매핑된다.
실행 중에 라이브러리의 함수를 호출하면 매핑된 라이브러리에서 호출할 함수의 주소를 찾아서 실행한다.
정적 링크를 하면 바이너리에 정적 라이브러리의 필요한 모든 함수가 포함된다.
해당 함수를 호출할 때 라이브러리를 참조하는 것이 아니라 자신의 함수를 호출하는 것처럼 호출할 수 있다.
PLT & GOT
PLT와 GOT는 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블이다.
바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑된다.
라이브러리 함수를 호출하면 함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색하고
해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮기게 된다.
(runtime resolve)
ELF는 GOT라는 테이블을 두고 resolve된 함수의 주소를 해당 테이블에 저장하고
나중에 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용한다.
resolve 되기 전의 함수를 실행하면 PLT로 넘어가게 되고 PLT에서 GOT를 찾는 resolve 과정을 거치게 된다.
이후 resolve 된 함수를 실행하면 PLT가 아닌 GOT로 바로 넘어가게 된다.
GOT에 대한 주소는 따로 검증 과정이 없어
공격자는 GOT overwrite를 통해 원하는 함수로 바꿔줄 수 있게 된다.
레퍼런스
https://dreamhack.io/lecture/courses/66
https://rond-o.tistory.com/216
'background > linux' 카테고리의 다른 글
환경 변수(environ) (0) | 2022.10.11 |
---|---|
ELF 파일 보호 기법 (0) | 2022.10.08 |
mprotect (0) | 2022.09.29 |
NOP Sled & RET Sled (0) | 2022.09.29 |
[G04T] Buffer OverFlow 1 (BOF1) (0) | 2022.07.26 |