본문 바로가기

DreamHack: System Hacking/F Stage 8

PIE & RELRO

PIE

[PIE(Position-Independent Executable)]: ASLR이 코드 영역에도 적용되게 해주는 기술. 무작위 주소에 매핑돼도 실행 가능한 실행 파일
-ASLR 환경에서 PIE가 적용된 바이너리 -> 실행될 때마다 다른 주소에 적재된다. 따라서, 코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 -> 바이너리가 적재된 주소를 알아야 한다.
[ELF]: 실행 파일 or 공유 오브젝트(ex. libc.so)
[PIE 우회]
a) 코드 베이스 구하기
b) Partial Overwrite:

**** 키워드 ****
-상대 참조(Relative Addressing): 어떤 값을 기준으로 다른 주소를 지정하는 방식
-Position Independent Code (PIC): 어떤 주소에 매핑되어도 실행 가능한 코드. 절대 주소를 사용하지 않으며 일반적으로 rip를 기준으로 한 상대 주소를 사용함.
-Position Independent Executable (PIE): 어떤 주소에 매핑되어도 실행 가능한 실행 파일. PIE의 코드는 모두 PIC이다. 자체적으로 보호 기법은 아니지만 ASLR이 적용된 환경에서는 시스템을 더욱 안전하게 만드는 효과가 있음. 최신 gcc는 기본적으로 PIE 컴파일을 함.
-Partial Overwrite: 어떤 값을 일부분만 덮는 공격 방법. PIE를 우회하기 위해 사용될 수 있음.

 

RELRO

[RELRO]: 데이터 세그먼트의 쓰기 권한을 제거하는 것
-Partial RELRO: 프로그램 실행 중 함수가 바인딩(lazy binding) 되어, got에 쓰기 권한이 있음
-Full RELRO: 바이너리 로딩 시점에 함수들의 주소가 바인딩 되므로, got에 쓰기 권한 부여(X)
(got, init array, fini array == 데이터 세그먼트에 위치해있음)

**** 키워드 ****
-RELocation Read-Only(RELRO): 불필요한 데이터 영역에 쓰기 권한을 제거함.
-Partial RELRO: init array, fini array 등 여러 섹션에 쓰기 권한을 제거함. Lazy binding을 사용하므로 라이브러리 함수들의 GOT 엔트리는 쓰기가 가능함. GOT Overwrite등의 공격으로 우회가 가능함.
-Full RELRO: init array, fini array 뿐만 아니라 GOT에도 쓰기 권한을 제거함. Lazy binding을 사용하지 않으며 라이브러리 함수들의 주소는 바이너리가 로드되는 시점에 바인딩됨. libc의 malloc hook, free hook과 같은 함수 포인터를 조작하는 공격으로 우회할 수 있음.

'DreamHack: System Hacking > F Stage 8' 카테고리의 다른 글

oneshot  (0) 2023.07.02
hook  (2) 2023.07.01
[함께 실습] Hook Overwrite  (0) 2023.06.25