[시스템 해킹] 🔒 RELRO

zzoni·2022년 8월 15일
0

시스템해킹

목록 보기
15/15
post-thumbnail

Lazy binding을 하는 바이너리는 실행 중에 GOT 테이블을 업데이트할 수 있어야 하므로 GOT에 쓰기 권한이 부여된다
👉 취약점 발생! 👉 RELRO 등장

◼ RELocation Read-Only(RELRO)

프로세스의 데이터 세그먼트를 보호하는 기법
쓰기 권한이 불필요한 데이터 세그먼트에 쓰기 권한을 제거한다.

RELRO는 RELRO를 적용하는 범위에 따라 두 가지로 구분된다.

  • Partial RELRO
    RELRO를 부분적으로 적용
  • Full RELRO
    가장 넓은 영역에 RELRO를 적용

◼ Partial RELRO

VS Full RELRO

실습 환경의 gcc는 Full RELRO기본 적용하며, PIE를 해제하면 Partial RELRO를 적용한다.

◼ 예제 코드

  • 예제코드인 prelo 섹션 헤더
    • 위 코드의 .got.plt, .data, .bss.init_array, .fini_array의 권한을 살펴봅시다! 👇
      • 메모리 맵
        .got.plt, .data, .bss만 쓰기권한 있음!

◼ Full RELRO

full relro를 적용한 것의 메모리맵과 섹션 헤더 정보도 살펴보면
.got에는 쓰기 권한이 제거되어 있으며 .data.bss에만 쓰기 권한




⬜ RELRO 기법 우회

  • Partial RELRO의 경우
    .got.plt영역에 쓰기 권한이 존재하므로 GOT Overwrite 공격을 활용할 수 있다.

  • Full RELRO의 경우
    .pot영역에도 쓰기 권한이 제거되어있어 라이브러리에 위치한 hook과 같은 함수 포인터를 조작하는 공격을 활용하여야 한다!

    • 라이브러리 함수의 대표적인 hook : malloc hook, free hook
      동적 메모리의 할당과 해제 과정에서 발생하는 버그를 디버깅하기 쉽게 하려고 만들어진 아이

    • malloc 함수의 코드를 살펴보면, 함수의 시작 부분에서 __malloc_hook이 존재하는지 검사하고, 존재하면 이를 호출한다.

    • __malloc_hooklibc.so에서 쓰기 가능한 영역에 위치한다.
      따라서 libc가 매핑된 주소를 안다면 이 변수를 조작하고 malloc을 호출하여 실행흐름을 조작할 수 있다. 이와 같은 공격기법을 HOOK Overwrite이라 한다.

profile
모든 게시물은 다크모드에서 작성되었습니다!

0개의 댓글