mprotect 예제

이 코드에서는 먼저 128kb (0x20000)를 할당한 다음 mprotect를 사용하여 사용 권한이없는 첫 번째 및 마지막 페이지를 설정하고이 메모리 영역을 스레드 스택으로 만듭니다. 시스템 호출은 Linux 커널에서 구현됩니다. 프로그램이 시스템 호출을 하면 인수가 패키징되어 커널로 전달되며, 이 인수는 호출이 완료될 때까지 프로그램 실행을 대신합니다. 시스템 호출은 일반적인 함수 호출이 아니며 커널로 제어를 전송하려면 특별한 절차가 필요합니다. 그러나 GNU C 라이브러리(GNU/Linux 시스템과 함께 제공되는 표준 C 라이브러리의 구현)는 Linux 시스템 호출을 함수로 래핑하여 쉽게 호출할 수 있습니다. 열기 및 읽기와 같은 낮은 수준의 I/O 함수는 Linux의 시스템 호출의 예입니다. /* 버퍼 읽기 전용으로 표시합니다. */ (mprotect(p, 1024, PROT_READ)) { perror(“수 없음 mprotect”); 출구(errno); } 라이브러리 함수는 프로그램 외부의 라이브러리에 있는 일반 함수입니다. 지금까지 제시한 대부분의 라이브러리 함수는 표준 C 라이브러리인 libc에 있습니다. 예를 들어 getopt_long 및 mkstemp는 C 라이브러리에 제공되는 함수입니다.

프로그램에서 시스템 호출 및 신호를 시청하려면 추적을 호출한 다음 프로그램 및 명령줄 인수를 호출하면 됩니다. 예를 들어, hostname 1 명령에 의해 호출 되는 시스템 호출을 보고, 이 명령을 사용 하 여: mprotect 프로세스에 속하는 모든 매핑된 메모리에 MMU 권한을 변경 하는 데 사용할 수 있습니다.: 또한, 코드를 변경 해야 합니다. : mprotect (p1 + 페이지 _크기, 페이지_크기, PROT_NONE); 를 참조하십시오( mprotect(p1, 페이지_크기, PROT_NONE); 지정된 액세스 권한을 메모리에 지정할 수 없습니다. 예를 들어, mmap(2) 읽기 전용 액세스 권한이 있는 파일을 매핑한 다음 mprotect()에게 PROT_WRITE로 표시하도록 요청하는 경우 이러한 문제가 발생할 수 있습니다. 그러나 BSS / DATA 섹션의 동적 할당 또는 버퍼와 같이 스택에 없는 메모리는 어떻습니까? 여기서 해당 가드 영역을 만들 수 있습니다 프로그램을 실행할 때 볼 수 있는 것의 예는 다음과 같습니다: mprotect() 간격 [addr, addr+)의 주소 범위의 일부를 포함하는 호출 프로세스의 메모리 페이지에 대한 보호를 변경합니다. len-1]. 추가기는 페이지 경계에 정렬되어야 합니다. Linux에서는 프로세스의 주소 공간의 모든 주소에서 mprotect()를 호출하는 것이 항상 허용됩니다(커널 vsyscall 영역 제외). 특히 기존 코드 매핑을 쓰기 가능한 것으로 변경하는 데 사용할 수 있습니다. SVr4, POSIX.1-2001. POSIX는 mprotect()의 동작이 mmap(2)을 통해 가져오지 않은 메모리 영역에 적용되는 경우 지정되지 않음을 말합니다. int mprotect (const void *addr, size_t len, int prot); 리눅스는 현재 약 200 개의 다른 시스템 호출을 제공합니다.

리눅스 커널의 버전에 대한 시스템 호출 목록은 /usr/include/asm/unistd.h에 있습니다. 이들 중 일부는 시스템에서 내부적으로 사용하기 위한 것이며 다른 일부는 특수 라이브러리 함수를 구현하는 데만 사용됩니다. 이 장에서는 응용 프로그램 및 시스템 프로그래머에게 가장 유용할 수 있는 시스템 호출을 소개합니다. 스레드가 버퍼를 오버플로하는 경우, 프로세스는 SIGSEGV를 얻고 해당 신호에 대한 신호 처리기를 작성하는 경우 , 문제가있는 스레드 컨텍스트에서 실행되므로 이를 잡을 수 있으므로 호스트 이름 프로그램 자체의 출력이 추적을 실행할 때 왜곡 된 것처럼 보일 수 있습니다. strace의 출력과 혼합됩니다. 구현에서는 sysconf()에서 반환되는 페이지 크기의 배수가 추가자가 되어야 합니다.

Mentalny Teatr Hipnozy > mprotect 예제