[완료]mips에서 system call hooking 관련 문의 입니다.
글쓴이: kwonsu / 작성시간: 수, 2019/07/10 - 12:28오전
안녕하세요
mips에서 커널 모듈을 이용하여 system call hooking을 해보는 중입니다.
x86에서는 실행된 코드를 mips에서 실행해 보았으나 실행되지 않는것을 확인했고
원인을 확인 중에 x86에서 사용하는 Enable/Disable page protection 부분에 문제가
있는 것을 확인하였습니다.
여러 사이트를 확인해보았으나 mips에서 page protection 하는 부분이나 이와 비슷한 기능을 하는 코드를
확인 할 수 없었습니다.
system call table는 System.map 파일로 확인하였고 system call hooking 프로그램 코드는 인터넷에
있는 여러 소스코드를을 대상으로 테스트를 하였습니다.
테스트 환경은 qemu로 구성하였고 아래와 같습니다.
1. Host PC
ubuntu 16.04 LTS
2. Guest PC
CPU : MIPS 24Kc V0.0 FPU V0.0
OS : debian-9.9.0-mips
kernel : 4.9.0-9-4kc-malta
x86은 page protection 처리 부분은 아래와 같은 것을 이용하여 한다는 것을 확인하였습니다.
12 #define PROT_DISABLE write_cr0(read_cr0() & (~ 0x10000)) 13 #define PROT_ENABLE write_cr0(read_cr0() | 0x10000) ... void set_addr_rw(unsigned long addr) { unsigned int level; pte_t *pte = lookup_address(addr, &level); if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW; } void set_addr_ro(unsigned long addr) { unsigned int level; pte_t *pte = lookup_address(addr, &level); pte->pte = pte->pte &~_PAGE_RW; } ... int set_page_rw(long unsigned int _addr) { return set_memory_rw(PAGE_ALIGN(_addr) - PAGE_SIZE, 1); } int set_page_ro(long unsigned int _addr) { return set_memory_ro(PAGE_ALIGN(_addr) - PAGE_SIZE, 1); }
예제 코드나 참고 사이트 및 기타 도움을 부탁드립니다.
감사합니다.
Forums:
자답입니다.
mips에서는 컨트롤 레지스트리를 제어하는 함수는 존재하지 않는것 같고 래지스트리 자체를 제어하려면 어셈블리를
해야 하는것으로 보입니다.
위와 같은 방법으로 접근을 해야 합니다.
그 근거로 mips의 define된 system call table의 내용은 아래와 같습니다.
파일의 경로는 /usr/include/mips-linux-gnu/asm/unistd.h 입니다.
system call table의 번호는 결과적으로 같겠습니다면 접근 방식 자체가 다른것으로 보입니다.
어떤분들에게 도움이 되셨으면 합니다.
지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....
댓글 달기