Post

(메모리 보호 기법) RELRO

RELocation Read-Only

!!! readelf -S결과가 ` W`권한이 있는 것으로 나오더라도 실제로 해보면 fault가 발생하므로 주의.

Partial-RELRO

default 옵션이며, .ctors(.init\_array), .dtors(.fini_array), .jcr, .dynamic section이 Read-Only 상태가 된다. .gotW 권한이 있기 때문에 GOT Overwrite가 가능하다.

1
2
3
4
5
6
7
.got.plt : 0x601000

  

./p\_RELRO 601028
WRITE : BBBB(0x601028)

-Wl,-z,norelro

Full-RELRO

컴파일 시 Full-RELRO 옵션을 주면 .got section도 추가로 Read-Only 상태가 된다. .got section이 Read-Only 상태이므로 따로 W권한을 주지 않으면 GOT-Overwrite가 불가능하다.

1
2
3
4
5
6
7
8
9
10
11
.got : 0x600ff8

  

./f\_RELRO 0x600ff8
Segmentation fault (core dumped)

  

compile option : gcc -o f\_RELRO -Wl,-z,relro,-z,now p\_RELRO.c

같은 source code로 컴파일 옵션만 다르게 주어 컴파일 했는데, GOT 주소가 다르다는 점에 유의한다. partial-RELRO 바이너리의 경우 함수를 처음 호출했을 때 그 함수가 .got.plt section에 바인딩되지만, Full-RELRO 바이너리는 .got section이 Read-Only 상태여야 하기 때문에 파일을 실행하는 시점에 이미 모든 함수가 .got section에 바인딩된다. 그래서 Full-RELRO 바이너리는 .got.plt section이 없고, .got section만 존재하며 이를 사용한다.

disable
1
gcc -Wl,-z,norelro
This post is licensed under CC BY 4.0 by the author.