Ye0ngJae

[Pwnable] Libc leak과 GOT Overwrite 본문

정보보안/포너블

[Pwnable] Libc leak과 GOT Overwrite

Ye0ngJae 2022. 10. 20. 08:40
728x90

PLT와 GOT를 모른다면 아래 게시물을 한 번 보고 오자

 

2022.10.20 - [정보보안/포너블] - [Pwnable] PLT & GOT

Libc leak


Libc란?

printf, scanf 등을 비롯한 C언어의 여러 함수들이 들어있는 라이브러리이다. Libc는 C언어의 표준 라이브러리인데 이 Libc 라이브러리는 로딩될 때 항상 일정한 규칙을 가진다.

 

바로 하위 1.5바이트가 0이라는 것이다. 이것은 Libc base라고 부른다. 즉, Libc base는 메모리에 매핑되어 있는 Libc의 시작 주소이다. Libc의 각 함수들에게는 오프셋이라는 것이 있는데 이 offset은 Libc base에 더해져서 실제 함수의 주소가 된다. ASLR 보호 기법에 의하여 여러 주소들이 랜덤화 되는데 Libc base는 랜덤화되지만 함수의 오프셋은 변하지 않는다. 즉, Libc base를 구한 상태에서 함수의 오프셋을 알고 있다면 ASLR 보호 기법이 적용되어 있다 하여도 원하는 함수를 실행 시킬 수 있다.

 

이 Libc base는 RTL을 이용하여 특정 함수의 실제 주소를 leak하고 offset을 뺀다. 실제 함수의 주소는 Libc base의 주소 + 함수의 offset 이므로 함수의 offset을 빼면 Libc base 값이 나온다. 이제 이 Libc base 값에 원하는 함수의 offset을 더하면 해당 함수의 주소 값을 구할 수 있다.

 

Libc는 버전마다 다르기 때문에 대다수의 문제의 경우 어떤 버전의 Libc를 사용하는지 정보를 제공하지만 만일 문제에서 Libc 버전에 대한 정보를 제공하지 않는 경우 libc.rip 라는 사이트에서 특정 함수의 심볼 이름과 오프셋만 입력하여 주면 Libc 버전에 대한 정보를 비롯한 기타 정보를 볼 수 있다.

GOT Overwrite


GOT Overwrite는 동적링킹을 통하여 생성된 실행파일이 라이브러리를 호출할 때 사용하는 GOT 값을 조작하여 기존에 프로그램에서 실행되는 함수를 원하는 함수로 바꾸어 버리는 공격 기법을 말한다.

 

함수를 호출 할 때 PLT와 GOT 값을 이용하여 함수를 호출한다. 이 GOT에는 함수의 실제 주소가 들어있는데, 이 주소를 변조하여 자신이 원하는 함수의 주소로 덮어준다면 기존 함수 대신에 공격자가 원하는 함수를 실행할 수 있을 것이다.

예를 들어 아래와 같은 코드로 이루어진 프로그램이 있을 경우 다음과 같다.

#include <stdio.h>

int main(){

	printf("/bin/sh");

	return 0;
}

printf 함수 안에 “/bin/sh” 문자열이 인자로 들어가 있는 상태이다. 만일 여기서 GOT Overwrite 기법을 이용하여 GOT를 system의 PLT로 바꾸어 준다면 아래와 같은 코드처럼 작동하게 될 것이다.

#include <stdio.h>

int main(){

	system("/bin/sh");

	return 0;
}

위처럼 GOT Overwrite를 이용하여 기존의 함수를 자신이 원하는 함수로 바꿀 수 있다.

728x90

'정보보안 > 포너블' 카테고리의 다른 글

[Pwnable] PLT & GOT  (0) 2022.10.20
RTL 기법에 대하여 알아보자  (0) 2022.10.03
메모리 보호 기법(Canary, NX Bit/DEP)  (1) 2022.09.26