본문으로 바로가기

<함수의 PLT, GOT>&got overwrite

category ROP 2021. 2. 19. 19:22

PLT,GOT

 

서론

외부 라이브러리를 불러오는 경우(Dinamic linking) 함수 호출을 위해 주소를 구하여 접근하는 방법이 필요하다. 

 

그래서 등장한 것이 PLT와 GOT이다.

 

개념

PLT

Procdedure Linkage Table의 약자로 프로시져들을 연결해 주는 테이블을 말한다. 프로그램을 어떻게 구현 했느냐에 따라 달라지기도 한다.

실제 호출 코드를 담고있으며 이 내용을 참조해 dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어진다.

 

GOT

Global Offset Table의 약자로 함수들의 주소를 담고 있는 테이블이다. 라이브러리 함수 호출 할때 PLT가 GOT를 참조하게 된다.

첫호출시엔 코드의 영역의 벡터 주소가 들어가 있고, 두번재 호출부터 그 함수의 실제 주소가 들어가져 있다.

 

중요한 이유

만약 내가 함수를 호출하면 먼저 PLT를 참조하게 된다. PLT는 어셈블리어 "jmp got" 즉, got를 참조하겠다는 뜻이다. GOT는 내가 불렀던 함수의 실제 주소가 담겨져 있는 곳이다. 순서를 정리하면 다음과 같다.

 

함수 호출 -> 그 함수의 PLT 참조 -> 그 함수의 GOT 참조 -> GOT에 들어 있는 실제 주소에 접근해 함수를 호출

 

+주황색 과정이 got overwrite이다

 

GOT Overwrite

 

개념

GOT Overwrite는 Dynamic Link방식으로 컴파일된 바이너리가 공유 라이브러리를 호출할 때 사용되는 PLT & GOT를 이용하는 공격 기법이다.

PTL는 GOT를 참조하고, GOT에는 함수의 실제 주소가 들어있는데, 이 GOT의 값을 원하는 함수의 실제 주소로 변조시킨다면, 원래의 함수가 아닌 변조한 함수가 호출된다.

 

ex) printf("/bin/sh"); "/bin/sh"라는 문자열을 출력하는 함수가있으면 printf함수를 system함수로 변조하여 system("/bin/sh"); 가 되어 쉘을 실행시킨다.

 

요약

정상적인 과정

 

GOT Overwrite

 

예제

<print.c>

#include <stdio.h>

int main()
{
    printf("/bin/sh");
}

 

gcc -o print print.c -no-pie -fno-pie -m32
-pie:위치 독립 실행 파일로 만든다

 

 

 

 

$gdb print

 

-print의 plt 주소 확인

 

print의 got 주소 로 jmp하는것을 확인

 

system 주소 확인

 

printf의 got 주소를 system주소로 바꿨더니 system 함수가 실행됨

 

 

 

 

 

 

참고:kblab.tistory.com/217?category=634422

'ROP' 카테고리의 다른 글

hackCTF rop  (0) 2021.02.19