저는 현재 syscall 후크와 로그를 사용하여 커널을 보호하기 위한 일부 프로젝트를 진행하고 있습니다... 이제 읽기 및 소켓 syscall 연결을 완료했으므로 execve를 사용하여 동일한 작업을 시도할 때(방금 실행된 파일에 따라) 커널 작업을 받고 있는 건가요, 아니면 dmesg를 열어 어떤 오류가 있는지 확인할 수 없기 때문에 뭔가 잘못하고 있는 건가요? (dmesg도 실행 가능합니다. 실행 파일을 실행하기 위해 함수를 재정의했습니다.) 나는 또한 stub_execve라는 것이 있다는 것을 알았고 시스템 호출 중 일부가 다른 바이너리 또는 이와 유사한 것으로 래핑되어 있기 때문에 시스템 호출 테이블에서 시스템 호출을 변경할 수 없다는 것을 알았습니다. (내가 틀렸다면 고쳐주세요) . 그래서 결국 내가 해야 할 일은 방금 어떤 파일이 실행되었는지 확인하고, 커널 모듈을 통해 이를 수행해야 하며, 이를 수행하는 방법이나 Stub_execve 또는 이와 유사한 것을 건너뛰는 방법을 아는 사람이 있는지 확인하는 것입니다. .? 도와주세요. 정말 감사하겠습니다.
답변1
조사해 보셨나요 kprobes
? 아니면 구체적으로 jprobes
.
jprobe를 사용하면 함수 execve
(또는 다른 커널 함수)에 연결할 수 있고 함수가 실행되기 전에 해당 인수를 확인할 수 있습니다. 작동 방식은 호출자가 추적하려는 함수와 동일한 서명이 있는 함수를 제공하고 이를 호출하여 등록하는 것입니다 jprobe_register
. 우리는 이 함수를 이라고 부릅니다 my_execve
. 그런 다음 실제 함수를 실행하기 전에 커널은 먼저 모든 컨텍스트(매개변수, 레지스터 값 등)를 스택에 저장하고 제어권을 스택에 전달하여 my_execve
해당 컨텍스트의 복사본을 전달합니다. 반환할 때 my_execve
( jprobe_return
대신 사용 return
) 커널은 원래 함수에 의해 저장된 컨텍스트를 복원 execve
하고 실행을 재개합니다. 이는 컨텍스트에 대한 변경 사항이 원래 기능의 실행에 영향을 미치지 않음을 의미합니다. 여기에서 예를 볼 수 있습니다.https://github.com/bytefire/esct/blob/master/esct.c.
레지스터의 값을 변경하는 등 컨텍스트를 조작하려는 경우 사용하면 kprobes
비슷한 패턴을 따르지만 약간 더 의미가 관련됩니다.