profile image

L o a d i n g . . .

article thumbnail image
Published 2021. 3. 21. 20:48

PLT, GOT

실습에 쓸 example4.c 파일이다.

 

example4의 main 함수를 disassemble 한 결과이다.

 

example4의 디스어셈블리 결과를 보면 puts와 scanf 함수를 호출할 때 해당 함수의 라이브러리 코드 주소로 바로 점프하지 않고 PLT 영역으로 점프하는 것을 확인할 수 있다.

 

Procedure Linkage Table(PLT)는 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블이다. Global Offset Table(GOT)는 PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블이다.

 

ASLR이 적용되어 있는 환경에서, 동적으로 라이브러리를 링크하여 실행되는 바이너리(Dynamically linked binary)는 바이너리가 실행될 때마다 라이브러리가 매핑되는 메모리의 주소가 변한다.

 

따라서 PLT와 GOT 영역이 존재하는 이유는 Dynamically linked binary의 경우 바이너리가 실행되기 전까지 라이브러리 함수의 주소를 알 수 없기 때문이다. 라이브러리가 메모리에 매핑된 후 라이브러리 함수가 호출되면, 정적 주소를 통해 해당 함수의 PLT와 GOT 영역에 접근함으로써 함수의 주소를 찾는다.

 

 

puts 함수의 PLT

 

puts 함수의 GOT

 

 

정리

 

Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하다.

 

Dynamic Link 방식으로 프로그램이 만들어지면 함수를 호출 할 때 PLT를 참조하게 된다. PLT에서는 GOT로 점프를 하는데, GOT에 라이브러리에 존재하는 실제 함수의 주소가 쓰여있어서 이 함수를 호출하게 된다.

 

그런데 이 때, 첫 호출이냐 아니냐에 따라 동작 과정이 조금 달라진다.

 

두 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지만, 첫 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지 않다.

 

그래서 첫 호출 시에는 Linker가 dl_resolve라는 함수를 사용해 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수를 호출한다.

 

 

 

 

Abusing PLT, GOT

특정 함수의 PLT를 호출하면 함수의 실제 주소를 호출하는 것과 같은 효과를 나타낸다. PLT의 주소는 고정되어 있기 때문에 서버에 ASLR 보호 기법이 적용되어 있어도 PLT로 점프하면 RTL과 비슷한 공격이 가능하다.

 

example4 예시에서 스택 버퍼 오버플로우 취약점을 이용해 리턴 주소를 puts@plt+6(0x8048326)으로 바꾸고, 첫 번째 인자는 "ASLR!" 문자열의 주소인 0x8048553로 바꿔 보겠다.

 

puts 함수가 실행되어 "ASLR!" 문자열이 출력된 것을 볼 수 있다. 하지만 puts 함수가 실행된 후 리턴할 주소는 0x42424242이기 때문에 Segmentation fault가 발생하여 프로그램이 비정상 종료된다.

 

 

함수가 호출될 때 GOT에 저장된 주소로 점프하기 때문에 GOT에 저장된 값을 바꾸면 원하는 주소로 점프할 수 있다.

example4 바이너리의 main 함수에 브레이크포인트를 걸고 실행한 후 puts 함수의 GOT인 0x804a00c 메모리의 값을 0xdeadbeef로 바꾸어 보겠다.

 

 

프로그램을 이어서 실행하면 puts가 호출될 때 puts@got에 저장된 값으로 점프해 eip 레지스터의 값이 0xdeadbeef로 바뀌게 된다.

 

이제 PLT에 존재하는 함수들, 즉 프로그램에서 한 번 이상 사용하는 라이브러리 함수들은 고정된 주소를 통해 호출할 수 있다는 것을 알게 되었다.

 

하지만 익스플로잇 대상 바이너리인 example4에서는 최종 목표인 셸을 획득하는 데 필요한 함수들(system 함수나 exec 계열 함수)을 사용하지 않기 때문에 ASLR 환경에서 직접적으로 해당 함수들을 호출할 수 없다.

 

 

 

참고
dreamhack - Linux Exploitation & Mitigation Part 2: PLT, GOT Section
bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/
 

PLT와 GOT 자세히 알기 1

Dynamic Linking 과정을 추적해 PLT와 GOT를 이해해보자 :) 시스템 해킹을 공부하시는 분들이라면 PLT와 GOT에 대해 알고 있을 것입니다. 이제 막 시스템 해킹 공부를 시작한 분들도 한 번 쯤 들어보셨을

bpsecblog.wordpress.com

 

'Hacking > Pwnable' 카테고리의 다른 글

[Pwnable] Lazenca - ROP(x64) 정리  (0) 2021.03.30
[Pwnable] Lazenca - ROP(x86) 정리  (0) 2021.03.29
[Pwnable] Lazenca - RTL(x64) 정리  (0) 2021.03.21
[Pwnable] Lazenca - RTL(x86) 정리  (0) 2021.03.20
[Pwnable] Format String Bug  (0) 2021.03.18
복사했습니다!