[Dreamhack] Bypass PIE & RELRO: 2 - PIE

securitykss·2023년 1월 12일
0

Pwnable 강의(dreamhack)

목록 보기
22/58

이 글은 https://dreamhack.io/lecture/courses/113 을 토대로 작성한 글입니다.

1. Introduction

ASLR을 적용하면 stack, heap, 라이브러리의 주소가 랜덤으로 무작위 매핑이된다.

하지만, main 등의 함수의 주소, 즉, 코드 영역의 주소는 고정적이다.

이런 취약점을 보완해주는 것이, PIE(Position-Independent Executable)이다.

PIE는 ASLR이 코드 영역에도 적용되게 끔 해주는 기술이다.

PIE는 보호 기법의 범주가 아니라, ASLR을 도와주는 하나의 기술이다.

2. PIC

리눅스에서 ELF는 실행 파일(Executable)과 공유 오브젝트(Shared Object, SO)가 있다.

실행 파일과 오브젝트는 file 명령어로 확인할 수 있다.

공유 오브젝트(SO)는 기본적으로 재배치(Relocation)이 가능하다.

재배치가 가능하다는 이야기는 메모리의 어느 주소에 있어도 코드의 의미가 훼손되지 않는다.

이러한 성질을 만족하는 코드를 PIC(Independent Code)라고 한다.

2.1 code compare

// Name: pic.c
// Compile: gcc -o pic pic.c
// 	      : gcc -o no_pic pic.c -fno-pic -no-pie
#include <stdio.h>
char *data = "Hello World!";
int main() { 
	printf("%s", data);
    return 0;
}

2.1.1 no-pic

main+14를 보면, 0x402011로 절대 주소로 참조를 한다.

2.1.2 pic

main+14를 보면, rip+0xec3로 상대 주소로 참조를 한다.(rip 기준으로 offset을 더해 상대주소 참조)

3. PIE

PIE(Position-Independent Executable)은 무작위 주소에 매핑돼도 실행 가능한 실행 파일이다.

게임으로 치면, 무기를 강화하는 아이템 느낌이다.

즉, ASLR을 무기라 하면, 강화하는 아이템은 PIE이다.

결론적으로, PIE로 ASLR을 강화시켜 stack, heap, 라이브러리 뿐만 아니라, 코드 영역까지도 랜덤화하여 무작위 매핑하게 한다.

PIE on ASLR

PIE는 재배치가 가능하므로, ASLR이 적용된 시스템에서는 실행 파일도 무작위로 적재된다.

4. PIE 우회

4.1 코드 베이스 구하기

ASLR 환경에서 PIE가 적용된 바이너리는 실행될 때 마다 다른 주소에 매핑된다.

그렇기에 코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 바이너리가 매핑된 주소를 알아야한다.

이 주소를 "PIE 베이스", "코드 베이스"라고 부른다.

코드 베이스를 구하려면 라이브러리의 베이스 주소를 구할 때 처럼 코드 영역의 임의 주소를 읽고, 그 주소에서 오프셋을 빼야한다.

4.2 Partial Overwrite

반환 주소의 일부 바이트만 덮는 공격을 Partial Overwrite라고 한다.

일반적으로 함수의 반환 주소는 호출 함수(Caller)의 내부를 가리킨다.

특정 함수의 호출 관계는 정적 분석 또는 동적 분석으로 쉽게 확인할 수 있으므로, 공격자는 반환 주소를 예측할 수 있다.(gdb, IDA 활용)

ASLR의 특성 상, 코드 영역의 주소도 하위 12비트(1.5bytes) 값은 항상 같다.

따라서 코드 가젯의 주소가 반환 주소와 하위 한 바이트만 다르다면, 이 값만 덮어서 원하는 코드를 실행시킬 수 있다.

만약 두 바이트 이상이 다른 주소로 실행 흐름을 옮기고자 한다면, ASLR로 뒤섞이는 주소를 맞춰야 하므로 브루트 포싱이 필요하고, 공격이 확률에 따라 성공하게 된다.

5. 마치며

PIE는 ASLR을 좀 더 광범위하게 무작위 매핑 시킬 수 있도록 하는 기술이다.

상대 참조(Relative Addressing): 어떤 값을 기준으로 다른 주소를 지정하는 방식

Position Independent Code(PIC): 어떤 주소에 매핑되어도 실행 가능한 코드. 절대 주소를 사용하지 않으며 일반적으로 rip를 기준으로 한 상대 주소를 사용함.

Position Independent Executable(PIE): 어떤 주소에 매핑되어도 실행 가능한 실행 파일. PIE의 코드는 모두 PIC이다.

Partial Overwrite: 어떤 값을 일부분만 덮는 공격 방법. PIE를 우회하기 위해 사용될 수 있음.

Reference

https://dreamhack.io/lecture/courses/113

profile
보안 공부를 하는 학생입니다.

0개의 댓글