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 의 값이 바뀐 것을 알 수 있다.



'pwnable > 기타' 카테고리의 다른 글

songsari's prob4  (0) 2016.09.12
songsari's prob3 (RTL)  (0) 2016.09.10
songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09

+ Recent posts