what is mprotect
흔히 보이지 않는 함수인데,
이미 mmap되어 있는 메모리 구간의 접근 권한을 런타임에 변경을 한다. 예를 들어 Read-Only → Read-Write로 잠깐 바꾸어 상수/리터럴을 패치하거나, JIT(Just-in-Time compile , 동적컴파일 )처럼 RW → RX 전환(W^X)을 할 수 있습니다.
원형
C
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
// 성공: 0, 실패: -1 + errno참고로 addr 는 페이지 경계에 맞추어서 써야한다.
예를 들어 .rodata 처럼 r 권한만 있는 섹션을 실행도중에 권한을 바꿔서 쓰고 싶다면,
C
mprotect(page, 4096, PROT_READ|PROT_WRITE)다음과 같이 PROT_WRITE 권한을 추가하면 된다.
근데 물론 막무가내로 성공하는 것이 아닌, 위에서 말한 페이지 정렬과
• W^X 정책(하드닝 배포판/커널 옵션/SELinux): 동시에 W+X 금지 또는 텍스트 세그먼트에 쓰기 금지(execmod) 정책에 걸리면 실패. • 권한 상승 불가: 매핑이 애초에 VM_MAYWRITE/EXEC 권한을 허용하지 않는다면(커널/정책/SELinux/PaX 등) EPERM.
다음과 같은 더 수준높은 정책을 통과하지는 못한다.