sys_call_table이 예측 가능한 이유는 무엇입니까?

sys_call_table이 예측 가능한 이유는 무엇입니까?

2.4(또는 이후?)에서는 sys_call_table기호를 더 이상 내보내지 않으므로 후킹 시스템 호출이 더 어려워집니다.

IDT에서 또는 읽기를 통해 이 정보를 계속 얻을 수 있다는 점을 무시하고 /boot/System.map-<kernel-version>이 주소가 재부팅과 머신(동일한 커널 버전 사용) 간에 일정한 것처럼 보이는 이유가 무엇인지 궁금합니다. 역동적으로 만드는 것이 가치가 있지 않나요? 정적이어야 하는 이유가 있나요?

내 목표는 다음과 같습니다.

sys_call_table후킹 시스템 호출을 더 어렵게 만들기 위해 더 이상 모듈로 내보내지지 않지만, 모듈(예: 커널 공간 프로그램)은 주소가 실행되는 모든 시스템에서 동일한 것처럼 보이므로 커널 버전 정보를 읽거나 간단히 추측하여 이 정보를 쉽게 System.map얻을 수 있습니다. on 동일한 버전의 커널.

답변1

커널 버전 4.8부터 최소한 x86에서는 시스템 호출 테이블의 주소를 포함하여 커널 주소 공간이 무작위로 지정됩니다. 바라보다RANDOMIZE_BASE커널 구성에서기본 세부 사항을 알아보세요.

이는 주어진 주소가 System.map쓸모가 없으며 시스템 호출 테이블의 주소가 부팅할 때마다 변경된다는 것을 의미합니다. 무언가를 디버깅해야 하고 이를 사용하려면 커널 명령줄 인수로 부팅하여 KASLR을 비활성화 System.map해야 합니다 .nokaslr

관련 정보