ASLR 이 적용되어 있으면 바이너리가 실행될 떄마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑된다.
하지만 이는 main함수의 주소에는 영향을 끼치지 못한다. 하지만 PIE 기술롣 이를 바꿀수 있다.
이때 리눅스 에서 ELF는 실행파일과 공유 오브젝트로 나뉜다. (공유 프젝-> libc6.so)
공유 오브젝트는 Position-Independent Code(PIC )로 어느 주소에 적재되어도 코드의 의미가 훼손 되지 않아, 재배치가 가능하다.
이는 ASLR과 비슷하여 하위 12bit(3byte)가 항상 같기 때문에 이를 이용하여 함수의 offset을 통해 base(이를 코드 베이스, PIE베이스라고함) 를 구하여 이를 토대로 익스 할수 있다.
하지만 코드베이스를 구하기 어렵다면, 함수 호출관계를 파악하여 반환 주소를 파악하게 되면 Partial Overwrite로 주소 일부분만 덮어 익스 하는 방법도 있다. (하위 1바이트 일 경우 거의 성공, 하위 2바이트일 경우. 브루트 포싱이 필요)
*Position Independent Code(PIC): 어떤 주소에 매핑되어도 실행 가능한 코드. 절대 주소를 사용하지 않으며 일반적으로 rip를 기준으로 한 상대 주소를 사용함.
(출처 드림핵)
RELRO
ELF는 GOT 테이블에 라이브러리 함수들을 저장(resolving) 하여 이를 통해서 함수를 불르는 방식, 즉 Lazy Binding을 취한다.
ELF의 데이터 세그먼트에 프로세스 초기화 및 종료와 관련된 .init_array, .fini_array가 있다. 이 영역에는 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있다. 여기에 공격자가 임의로 값을 쓸수 있다면, 실행 흐름 조작 가능.
이러한 문제(GOT overwrite)를 해결하고자 고완된 ReLocation Read-Only(RELRO). 이는 쓰기 권한이 불필요한 데이터 세그먼트에 쓰기 권한을 제거한다.
RELRO는 보통 Partial RELRO 이고 Full RELRO로 관련 문제가 출제된다.
**objdump -h ./RELRO 명령어로 각 섹션 헤더를 볼 수 있다.
.got: 전역변수 처럼 실행되기전 미리 binding 된 변수들이 저장되는 테이블
.got.plt: 실행중 바인딩(lazy binding)되는 변수들이 위치.
'Pwnable > Tech' 카테고리의 다른 글
SHA - SECCOMP(Sandbox), Bypass SECCOMP (0) | 2022.02.10 |
---|---|
FSB 에 대해 (0) | 2022.02.07 |
-STACK- Stack Canary (0) | 2022.01.06 |
-Heap- Tcache Poisoning (0) | 2022.01.06 |
-Heap- DFB(Double Free Bug) (0) | 2022.01.05 |