RELocation Read-Only

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

Partial-RELRO

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

```

.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가 불가능하다.

```

.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

```
gcc -Wl,-z,norelro
```