2011-12-04 3 views
4

시스템 호출 테이블을 수정하여 sys_execve() 함수를 리눅스 3.x 커널에 연결하려고합니다. 문제는 sys_execve()이 실행이 실패한 경우에만 오류 코드를 반환한다고 가정합니다. 래퍼 함수 (아래 참조)를 사용하면 sys_execve()이 유효한 실행 파일에서 호출 될 때 제대로 실행되고 모든 것이 잘 수행됩니다.리눅스 3.x에서 sys_execve() 후킹

segfault at 3b ip 000000000000003b... 

는 후크 sys_execve() 쇼 -1 ENOSYS 대신의 반환 값을 검사 strace 사용 :이 오류 조건을 일으키는 존재하지 않는 파일 또는 다른 뭔가라고 할 때 함께하지만, 호출 프로그램이 충돌합니다 정확한 오류 코드. sys_execve()에 대한 Linux 소스 코드뿐만 아니라 래퍼 함수의 어셈블리를 검사 한 이후로 나 혼란 스럽다. 내 래퍼가 오류 코드를 제대로 전달하지 못하는 이유에 대한 제안 사항이 있습니까?

asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) { 
    return orig_func(name, argv, envp, regs); 
} 
+0

그것은되지 관련이있을 수 있지만 리눅스> 3 시스템 호출을 대체에 관심이 :

현재 sys_execve 후킹 내 전체 솔루션을 볼 수 있습니다. 그것에 관한 정보를 제공해 주실 수 있습니까? – gaurav

답변

3

당신은 x86_64sys_execvestub_execve에서 호출과 같은 방식으로 시스템 호출 테이블을 수정하여 execve 후크 수 없습니다. 따라서 콜 체인은 sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve ... LXR에 stub_execve을보십시오.

0

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