메모리 보호 기법 (RELRO)
메모리 보호 기법 종류
- NX Bit ( MS : DEP )
- ASLR
- Canaries
- RELRO
- PIE
RELRO
Explanation
-
RELRO는 RELocation Read-Only의 줄임말이며, ELF 바이너리 / 프로세스의 데이터 섹션의 보안을 강화하는 일반적인 기술이다.
-
RELRO에는 Partial RELRO와 FULL RELRO 두가지 모드가 있다.
-
각각 RELRO에 대한 특징은 다음과 같다.
-
No RELRO
-
명령어 옵션 : gcc -Wl,-z,norelro
-
Lazy Binding
-
Write to GOT
-
-
Partial RELRO
- 명령어 옵션 : gcc -Wl,-z,relro
- Lazy Binding
- Write to GOT
- RELRO in the Program Header
- Section include in RELRO
- INIT_ARRAY
- FINI_ARRAY
-
FULL RELRO
- 명령어 옵션 : gcc -Wl,-z,relro,-z,now
- Now Binding
- RELRO in Program Header
- Section include in RELRO
- INIT_ARRAY
- FINI_ARRAY
- PLTGOT
-
-
부연 설명
Lazy Binding은 got호출 시점에 라이브러리를 메모리에(?) 저장하는것이다.
Now Binding은 프로그램 실행시 라이브버리를 메모리에(?) 저장하는 것이다.
실습
#include <stdio.h>
#include <string.h>
void main(){
char address[16];
size_t *pointer;
int count = 1;
while(count != 100)
{
printf("----- %d -----\n",count);
memset(address,0,16);
printf("Input Pointer address : ");
fgets(address,16,stdin);
pointer = strtol(address,0,16);
printf("Pointer address : %p\n",pointer);
printf("Input Pointer text : ");
fgets(pointer,16,stdin);
printf("Pointer text : %s\n",pointer);
count++;
}
scanf("%s",address);
}
주소를 입력한뒤 그곳에 텍스트를 입력하면 그 주소에 입력된 텍스트를 정수로 바꾸어 넣어주는 소스코드이다.
No RELRO
gdb에 있는 기능 중 elfsymbol을 입력하여 각 함수의 @plt 주소를 구하고 입력에 관한 scanf함수를 더 자세히 찾아 got 주소를 알아낼 수 있었다.
got주소에 어떤 값이 들어있는지 확인하고 위 함수를 이용해 해당 주소에 값을 바꾸었을 때 성공적으로 값이 바뀌는 것을 확인하였다.
따라서 GOT Overwrite가 가능하다는 것을 확인할 수 있었다.
Partial RELRO
Partial RELRO 또한 같은 과정을 통해 GOT Overwrite 가 가능하다는 것을 확인하였다.
FULL RELRO
FULL RELRO는 앞서 보았던 No RELRO, Partial RELRO와 다르게 GOT Overwrite가 일어나지 않는것을 확인했다.
그 이유는 FULL RELRO에 Program Header 에 RELRO 영역에는 PLT GOT가 포함되어 있어서 got가 Read-Only로 작동하기 때문에 값이 수정될 수 없는 것이다.
Reference
http://lazenca.net/display/TEC/04.RELRO
http://lazenca.net/pages/viewpage.action?pageId=1147912
https://hackstoryadmin.tistory.com/entry/Linux-Memory-Protection-RELRO