2013-03-11 3 views
2

x86_32의 Linux 커널 v3.5에서 sys_execve syscall을 연결하려고합니다. 난 그저 내가 sys_call_table이 항목을 수정하기위한 설정 페이지의 권한을 수행하고 언급 체계가 다른 콜 (CHDIR, MKDIR 등)에서 잘 작동 나의 후크 함수sys_execve 3.5 커널에 후킹

asmlinkage long (*real_execve)(const char __user*, const char __user* const __user*, 
       const char __user* const __user*); 
... 
asmlinkage long hook_execve(const char __user* filename, const char __user* const __user* argv, 
        const char __user* const __user* envp) 
{ 
    printk("Called execve hook\n"); 
    return real_execve(filename, argv, envp); 
} 
... 
real_execve = (void*)sys_call_table[ __NR_execve ]; 
sys_call_table[ __NR_execve ] = (unsigned long)hook_execve; 

에 sys_call_table이 엔트리 주소를 변경합니다.

Mar 11 14:18:08 mbz-debian kernel: [ 5590.596033] Called execve hook 
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596408] BUG: unable to handle kernel NULL pointer dereference at (null) 
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596486] IP: [< (null)>] (null) 
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596526] *pdpt = 0000000032302001 *pde = 0000000000000000 
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596584] Oops: 0010 [#1] SMP 

내가 PTREGSCALL3(execve)가 포함되어 있기 때문에 arch/x86/kernel/entry_32.S의 세 가지 매개 변수와 sys_execve 전화 :하지만 원하면 execve 후킹에 난 널 포인터 디 레퍼런스를 얻었다. 그러나, 나는 4 개의 매개 변수 (추가 struct pt_regs*)와 전화를 시도했지만 동일한 오류가있어. 어쩌면 execve에 대한이 접근 방식이 완전히 잘못되었을 수도 있습니다. 또는 나는 무엇인가 놓쳤 느냐?

업데이트 # 1

나는 sys_call_table[ __NR_execve ] 실제로 ptregs_execve (안 sys_execve)의 주소를 포함하고 있음을 발견했다. arch/x86/kernel/entry_32.S에 다음과 같이 정의된다 :

#define PTREGSCALL3(name) \ 
ENTRY(ptregs_##name) ; \ 
CFI_STARTPROC; \ 
leal 4(%esp),%eax; \ 
pushl_cfi %eax; \ 
movl PT_EDX(%eax),%ecx; \ 
movl PT_ECX(%eax),%edx; \ 
movl PT_EBX(%eax),%eax; \ 
call sys_##name; \ 
addl $4,%esp; \ 
CFI_ADJUST_CFA_OFFSET -4; \ 
ret; \ 
CFI_ENDPROC; \ 
ENDPROC(ptregs_##name) 
... 
PTREGSCALL3(execve) 

그래서 나는 그것의 주소를 수정하지 않고 해당 코드를 교체해야 sys_execve을 수정하려면? 비슷한 것을 읽었습니다 here, 이것이 갈 길입니까?

업데이트 # 2

사실 나는 다음과 같은 호출 시퀀스를 발견 do_execve->do_execve_common->search_binary_handler->security_bprm_check를,이 security_bprm_check 이진의 실행을 제어 LSM (리눅스 보안 모듈) 작업의 래퍼입니다. 그 후 나는 this link을 읽고 따라 갔고 나는 그것을 작동 시켰습니다. 그것은 지금 나는 실행될 프로세스의 이름을 볼 수있는 것처럼 내 문제를 해결하지만, 나는 그것의 정확성에 대해 여전히 확신 할 수 없다. 어쩌면 다른 누군가가이 모든 것들에 대해 명확성을 더할 것입니다.

+0

이 게시물에는'sys_call_table' 수정 http://stackoverflow.com/questions/8372912/를 통해 sys_execve''훅 수없는 이유를 설명 sys-execve-on-linux-3-x/9672512 # 9672512 –

+0

@IlyaMatveychikov 그래서 sys_call_table을 통해 sys_execve에 대한 작업 훅을 만들었습니다. –

+0

@ kagali-san 시스템'sudo grep stub_execve/proc/kallsyms'에서 다음 명령을 실행하십시오. –

답변

1

이전에는 Linux 커널에서 syscall을 연결하는 것이 더 쉬운 작업 이었지만, 새로운 커널에서는 어셈블리 스텁이 syscalls에 추가되었습니다. 이 문제를 해결하기 위해 커널의 메모리를 즉시 패치합니다.

현재 sys_execve 후킹 내 전체 솔루션을 볼 수 있습니다 https://github.com/kfiros/execmon