2013-10-31 6 views
0

일부 메모리 페이지를 쓰기 보호로 설정하려면 mprotect를 사용하고 있습니다. 해당 메모리 영역에서 쓰기가 시도되면 프로그램은 SIGSEGV 신호를받습니다. 신호 처리기에서 어떤 메모리 주소에서 쓰기가 시도되었는지는 알지만 어떤 명령이 쓰기 보호 위반을 초래하는지 찾는 방법을 알지 못합니다. 그래서 신호 처리기 내부에 잘못된 명령을 얻기 위해 프로그램 카운터 (PC) 레지스터를 읽는 것을 고려 중입니다. 이 작업을 수행하는 쉬운 방법이 있습니까?mprotect : 보호 위반을 일으키는 지침을 얻는 방법은 무엇입니까?

답변

3

당신이 SA_SIGINFO 플래그 sigaction를 사용하여 신호 처리기를 설치하는 경우, 신호 처리기에 세 번째 인수 차례로 유형 mcontext_t의 구조를 포함 유형 ucontext_t의 구조에 void *하지만 포인트를 입력있다. mcontext_t의 내용은 구현에 따라 정의되며 일반적으로 CPU 아키텍처에 따라 다르지만 여기서는 저장된 프로그램 카운터를 찾을 수 있습니다.

unwinding 테이블과 함께 컴파일러의 내장 함수 (0이 아닌 인수를 가진 __builtin_return_address)가 신호 처리기를 통해 추적 할 수도 있습니다. 이것이 좀 더 일반적인 (가시적 인 cpu-arch에만 국한된 것은 아니지만), 더 취약하다는 생각이 들며 실제로 작동하는지 여부는 cpu-arch와 ABI에만 해당 될 수 있습니다.