PLT & GOT
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 함수로 점프

테스트 파일은 위와 같다.

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

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

먼저 printf 함수가 한 번도 수행되기 전에 호출되는 주소 0x8048308(PLT 영역)에서 3개의 명령어를 보면 다음과 같다.
1. 0x08049ac로 점프한다. / GOT 참조
2. 0x0804830e 주소로 점프한다. / 처음 호출되었기 때문에 실제 주소가 없다.
3. 0x080482c8 주소로 점프한다. / _dl_runtime_resolve 수행
마지막으로 GOT에 실제 주소 저장 후, 해당 주소로 점프한다.

두 번째 printf 함수를 살펴보기 위해 첫 번째 printf 함수가 종료직후에 브레이크 포인트를 설정하고 실행한다. 그리고 다시 호출되는 주소 0x8048308(PLT 영역)에서 3개의 명령어를 보면 다음과 같다.
1. 0x080494ac 주소로 점프한다. / GOT 참조
2. 0x4006604c 주소로 점프한다. / printf 함수로 점프한다.
'ETC > Security' 카테고리의 다른 글
| 리눅스 환경에서의 메모리 보호 기법 (0) | 2019.08.02 |
|---|---|
| RTL / Return To Library (0) | 2019.08.01 |
| 리눅스 환경에서 공유 라이브러리 내의 함수 주소와 필요한 인자 주소 알아내기 (0) | 2019.08.01 |
| 리눅스 환경에서 환경변수로 저장한 shellcode 주소 알아내기 (0) | 2019.07.23 |