티스토리 뷰




linux 환경에서의 메모리 보호기법들 2 (RELRO)

RELEO : Relocation Read-Only


  • GOT overwrite 와 같은 공격에 대비하여 ELF 바이너리 또는 프로세스의 데이터 섹션을 보호하는 기술

  • 메모리가 변경되는 것을 보호하는 기술


RELRO에는 Partial RELRO 와 Full RELRO 두 가지 모드가 있음


Partial RELRO

  • 컴파일 옵션 : gcc -WI, -z, relro

  • GOT 상태 : Writable

  • 특징 : 함수 호출 시 해당 함수의 주소를 알아옴

Full RELRO

  • 컴파일 옵션 : gcc -WI, -z,  relro, -z, now

  • GOT 상태 : Read-Only

  • 특징 : ELF 실행 시 GOT에 모든 라이브러리 주소 바인딩


  • Full-RELRO를 적용하면 .ctors, .dtors, .jcr, .dynamic, .got 섹션이 Read-only 상태가 됨


    1. RELRO가 적용되지 않은 경우

  • odjdump 를 이용하여 .ctors, .dtors, .jcr, .dynamic, .got 섹션들의 위치를 구할 수 있음. (명령어 : odjdump -h [파일 이름] )

  • 다섯 섹션들 모두에 데이터가 써짐


      2. Partial RELRO 인 경우odjdump 를 이용하여 .ctors, .dtors, .jcr, .dynamic, .got 섹션들의 위치를

구할 수 있음. (명령어 : odjdump -h [파일 이름] )

  • 다섯 섹션들에 데이터 쓰기를 시도 시 Segmentation fault가 발생함.

  • 그 이유는 write 권한이 없기 때문임.

  • Partial RELRO에서 GOT Overwrite가 가능

    • readelf -r ./[프로그램 이름] | grep [함수명]으로 GOT 주소를 알아 올 수 있음.


      3. Full RELRO인 경우

  • GOT OVERWRITE 불가능.


FULL RELRO가 GOT가 읽기전용이라 보안상 더 안전할 것 같지만, Partial RELRO가 더 널리 사용 됨.


그 이유는 FULL RELRO는 링커에 의해 모든 메모리에 대해 재배치 작업이 일어나 실행이 느려지기 때문이다.

Comments