(메모리 보호 기법) RELRO
RELocation Read-Only
!!! readelf -S
결과가 ` W`권한이 있는 것으로 나오더라도 실제로 해보면 fault가 발생하므로 주의.
Partial-RELRO
default 옵션이며, .ctors(.init\_array), .dtors(.fini\_array), .jcr, .dynamic
section이 Read-Only 상태가 된다. .got
에 W
권한이 있기 때문에 GOT Overwrite가 가능하다.
1
2
3
4
5
6
7
8
.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
12
.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
2
gcc -Wl,-z,norelro
This post is licensed under CC BY 4.0 by the author.