PLT . GOT 정리
PLT (Procedure Linkage Table)
실제 호출 코드를 담고 있는 테이블
이 내용 참조를 통해 실제 시스템 라이브러리 호출이 이루어진다.
GOT (Global Offset Table)
GOT는 PLT 가 참조하는 테이블로써 프로시져들의 주소를 가지고 있다.
PLT가 어떤 함수를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 된다.
간단한 예제를 통해 PLT 와 GOT를 이해해보자.
사용할 소스코드는 다음과 같다
비교적 간단한 소스코드이다.
사용하는 운영체제가 64bit 이므로
32bit로 깔끔하게 컴파일 해주기 위해 -fno-stack-protector -m32 옵션을 주었다.
이 옵션을 주기 위해서는 gcc-multilib가 필요하다.
apt-get install gcc-multilib 명령어를 이용해 설치할 수 있다.
이제 gdb를 이용하여 만들어진 바이너리를 열어보자.
disas main을 해보면 0x80482c0(puts@plt영역) 에 call하는 것을 볼 수있다.
printf 함수가 내부적으로 puts을 호출하나 보다 -ㅅ-
살펴보자.
PLT 영역을 보면 puts에 대해서 3단계로 구성되어 있는것이 보인다
그럼 첫 번째 jmp는 당연히 GOT영역이 된다는 것을 알 수 있다.
GOT 부분을 보면 PLT의 두번째 부분을 가리키는 것을 알 수 있다.
이는 첫번째 호출이기 때문이다.
문 득 공부하다보니!
첫번째 호출이 아니라면? 이라는 의문을 가질 수 있었다.
printf 함수를 한번 사용해본 상태에서 break point를 걸고 확인해보자.
printf 가 한번 실행됬다.
0x80496c4 의 값이 바뀐 것을 알 수 있다.