본문 바로가기

System Security/Technology

GOT Overwrite

GOT Overwrite 란? 

GOT Overwrite는 컴파일 과정 중 Link 부분에서 Static Linking 방식이 아닌 Dynamic Linking 방식으로 컴파일된 바이너리가 공유 라이브러리(Shared Library)에 존재하는 함수를 호출할 때 PLT와 GOT 과정을 거치는데 GOT에 원래 함수가 아닌 변조된 함수를 호출하도록 하여 공격하는 방식입니다. 

 

PLT와 GOT에 대해 간단하게 설명을 드리자면, printf 함수와 같이 공유 라이브러리에(Shared Library)에 존재하는 함수를 사용하기 위해서는 printf 함수의 PLT를 호출한 후, GOT로 점프하여 함수의 실제 주소가 쓰여 있는 곳으로 이동하는 과정을 거칩니다. 

 

이때, 첫 호출이라면 GOT는 실제 함수의 주소를 가지고 있지 않고, 어떤 과정을 거쳐 함수의 실제 주소를 알아내고, 두 번째 호출부터는 첫 번째 알아낸 주소로 바로 이동하게 됩니다. 

 

이제 PLT와 GOT에 대해 간단히 다뤘으니, 예제 코드를 통해 GOT Overwrite 공격이 어떻게 수행되는지 알아봅시다. 

Code

#include <stdio.h> 

int main(void) { 
	char buf[32] ; 

	gets(buf) ; 
	puts(buf) ; 
	return 0 ; 
}

위 코드는 gets 함수를 통해 입력을 받고 puts 함수를 통해 입력받은 것을 출력하는 프로그램입니다. 

Analysis

컴파일 과정을 거쳐 gdb를 실행시켜줍니다. 컴파일 과정에서 warning이 뜨는 것은 gets함수가 buffer overflow를 일으킬 수 있는 취약한 함수이기 때문입니다. 

main 함수를 보시면 call 0x7047340 <gets@plt>, call 0x8048360 <puts@plt> 라고 적혀있는 부분을 볼 수 있습니다. 즉, 이 부분이 위에서 말씀드렸던 함수의 PLT를 호출하는 부분입니다. 

puts@PLT

puts 함수의 PLT 주소를 보시면 jmp DWORD PTR ds:0x804a014 라고 되어있는 부분을 볼 수 있습니다. 이 부분(0x804a014 주소)이 puts 함수의 GOT 주소입니다. 

 

  • puts 함수가 호출 되기 전

puts 함수가 호출 되기 전 puts 함수의 GOT를 보면, 바로 밑에 push 0x10 instruction 주소를 담고 있는 것을 확인할 수 있습니다. 제가 앞에서 말씀드렸던 "첫 호출이라면 GOT는 실제 함수의 주소를 가지고 있지 않고, 어떤 과정을 거쳐 함수의 실제 주소를 알아낸다" 라고 했던 것처럼 push 0x10, jmp 0x8048330 과정을 거치며 실제 주소를 알아가는 과정을 거칩니다. 

  • puts 함수가 호출된 후

puts 함수가 호출되고 나면, puts 함수의 GOT가 이전과 다른 것을 확인할 수 있습니다. 즉, puts 함수 호출 시 공유 라이브러리 (Shared library) 실제 주소로 바로 이동할 수 있도록 설정되어 있는 것입니다. 

 

이제 GOT Overwrite를 수행해보도록 합시다.

위에서 보았던 0x804a014 (puts 함수의 GOT)에 system 함수의 실제 주소로 덮어쓰면 어떻게 될까요? 

이와 같이, puts 함수의 GOT에 0xb7e42db0 (system 함수 주소)가 들어 있는 것을 확인할 수 있습니다. 그럼, 여기서 공격이 어떻게 수행될 수 있을까요? 

 

코드에서 puts(buf); 라는 부분이 있었는데 여기서 만일 buf가 "/bin/sh"이 입력되고 puts 함수가 실행된다면, puts 함수의 PLT가 호출되고 puts 함수의 GOT로 점프하면서 GOT Overwrite로 인해 system 함수를 실행시키게 되어, system("/bin/sh"); 이 실행되는 것입니다. 즉, 쉘을 실행시키게 되는 것이죠. 

 

이를 수행해보면 아래와 같이 잘 실행되는 것을 알 수 있습니다. 

이와 같이, GOT Overwrite에 대해 알아보았습니다. 

'System Security > Technology' 카테고리의 다른 글

메모리 보호 기법  (0) 2022.02.13
CTF Tools  (0) 2022.02.13
Use after free  (0) 2022.01.23
NOP Sled  (0) 2022.01.19
스택 프레임(Stack Frame)이란?  (0) 2022.01.18