메모리 보호 기법 (RELRO)

메모리 보호 기법 종류

  1. NX Bit ( MS : DEP )
  2. ASLR
  3. Canaries
  4. RELRO
  5. PIE

RELRO

Explanation

  • RELRO는 RELocation Read-Only의 줄임말이며, ELF 바이너리 / 프로세스의 데이터 섹션의 보안을 강화하는 일반적인 기술이다.

  • RELRO에는 Partial RELRO와 FULL RELRO 두가지 모드가 있다.

    • 각각 RELRO에 대한 특징은 다음과 같다.

      • No RELRO

        1. 명령어 옵션 : gcc -Wl,-z,norelro

        2. Lazy Binding

        3. Write to GOT

      • Partial RELRO

        1. 명령어 옵션 : gcc -Wl,-z,relro
        2. Lazy Binding
        3. Write to GOT
        4. RELRO in the Program Header
        5. Section include in RELRO
          • INIT_ARRAY
          • FINI_ARRAY
      • FULL RELRO

        1. 명령어 옵션 : gcc -Wl,-z,relro,-z,now
        2. Now Binding
        3. RELRO in Program Header
        4. 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

image

gdb에 있는 기능 중 elfsymbol을 입력하여 각 함수의 @plt 주소를 구하고 입력에 관한 scanf함수를 더 자세히 찾아 got 주소를 알아낼 수 있었다.

got주소에 어떤 값이 들어있는지 확인하고 위 함수를 이용해 해당 주소에 값을 바꾸었을 때 성공적으로 값이 바뀌는 것을 확인하였다.

따라서 GOT Overwrite가 가능하다는 것을 확인할 수 있었다.

Partial RELRO

image

Partial RELRO 또한 같은 과정을 통해 GOT Overwrite 가 가능하다는 것을 확인하였다.

FULL RELRO

image

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