이전에 드림핵의 return to shell이라는 문제를
버퍼에 셸 코드를 저장해두고 리턴 주소를 버퍼의 주소로 overwrite해서
셸을 탈취하는 방식으로 풀었는데
이는 셸 코드가 저장된 영역에 쓰기와 실행 권한이 부여되었기에 가능했던 것이다.
만약 실행 권한이 없었다면 셸 코드가 실행되지 않아 셸 탈취가 불가능하다.
mprotect
mprotect() 함수는 메모리의 권한을 바꿔주는 함수이다.
sys/mman.h 라이브러리에 있는 함수로 아래와 같은 형식을 가지고 있다.
int mprotect(void *addr, size_t len, int prot);
인자들을 보면
addr은 권한을 바꿀 주소를 정해준다.
len에 바꿀 길이를 정해주고 prot로 바꿀 권한을 정해준다.
prot에는 'PROT_권한종류'의 형식으로 작성하며 |(or)로 여러 개를 전달할 수 있다.
PROT_READ | PROT_EXEC | PROT_WRITE
mprotect() 함수는 [주소값]부터 [주소값+len-1]를 포함하는 메모리 페이지의 접근 권한을 수정해준다.
여기서 addr은 반드시 정렬된 페이지 boundary여야 한다.
(Page Size = 0x1000 = 4096)
그래서 addr의 마지막 3자리는 0으로 맞춰줘야 한다.
(안 맞춰주면 에러 발생)
레퍼런스
https://aidencom.tistory.com/m/490
https://velog.io/@woounnan/SYSTEM-mprotect
https://man7.org/linux/man-pages/man2/mprotect.2.html
'background > linux' 카테고리의 다른 글
환경 변수(environ) (0) | 2022.10.11 |
---|---|
ELF 파일 보호 기법 (0) | 2022.10.08 |
NOP Sled & RET Sled (0) | 2022.09.29 |
PLT(Procedure Linkage Table) & GOT(Global Offset Table) (0) | 2022.09.13 |
[G04T] Buffer OverFlow 1 (BOF1) (0) | 2022.07.26 |