PIE란?

PIE는 Position-Independent Executable의 약자로 어떤 주소에 매핑되어도 실행 가능한 파일. PIE의 코드는 모두 PIC이다. 자체적으로 보호 기법은 아니지만 ASLR이 적용된 환경에서는 시스템을 더욱 안전하게 만드는 효과가 있다. 최신 gcc는 기본적으로 PIE 컴파일을 한다.

<aside> 🚚

PIC란?

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

쉽게 설명해서 어떤 메모리에 위치 할 수 있고, 수정 없이 실행 가능한 주소 이다. (상대 주소 이기 때문)

</aside>

RELRO란?

RELRO는 RELocation Read-Only의 약자로 쓰기 권한이 불필요한 곳에서 쓰기 권한을 제거하는 보호기법이다.

RELRO는 범위에 따라 두개로 나뉘는데, 부분적으로 적용하는 Partial RELRO와 가장 넓은 영역에 적용하는 Full RELRO가 있다

RELRO는 PIE와 마찬가지로 checksec으로 확인 할 수 있다.

Partial RELRO의 경우 .got .plt 의 영역에 대한 쓰기 권한이 존재하므로 GOT overwirte 공격을 할 수 있다.

Full RELRO의 경우 .got 영역에도 쓰기 권한이 제거된다. 그래서 공격자들 덮어쓸 수 있는 다른 함수의 포인터를 찾다가 라이브러리에 위치한 hook을 찾게 되었다. 라이브러리에 대표적인 hook 함수에는 malloc hook과 free hook이 있다.

원래 이 함수 포인터는 동적 메모리의 할당과 해제 과정에서 발생하는 버그를 디버깅하기 쉽게 하려고 만들어졌다.

malloc 함수의 코드를 보면 함수의 시작부분에서 __malloc_hook 이 존재하는지 검사하고, 만약 존재한다면 이를 호출한다. 따라서 libc의 베이스 주소를 알 때, 이 변수를 조작하고, 실행 흐름을 조작할 수 있다. 이 같은 공격 기법을 Hook Overwrite라고 부른다.

hook 문제