후크 기능이 있습니다소켓Hook.c가로채기소켓()부르다:
#include <stdio.h>
int socket(int domain, int type, int protocol)
{
printf("socket() has been intercepted!\n");
return 0;
}
gcc -c -fPIC socketHook.c
gcc -shared -o socketHook.so socketHook.o
그리고 간단한 프로그램pwuid.c 얻기(1) 그냥 전화해getpwuid()기능:
#include <pwd.h>
int main()
{
getpwuid(0);
return 0;
}
gcc getpwuid.c -o getpwuid
getpwuid()내부적으로 하나 만들었습니다소켓()부르다. CentOS에서:
$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM, 0) = 4
우분투에서:
$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
(1)을 실행하면,소켓()CentOS에서는 차단되지만 Ubuntu에서는 차단되지 않습니다.
CentOS. 인쇄()~에서소켓Hook.c존재하다:
$ uname -a
Linux centos-stream 4.18.0-301.1.el8.x86_64 #1 SMP Tue Apr 13 16:24:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
socket() has been intercepted!
우분투(주분투 20.04).인쇄()~에서소켓Hook.c존재하지 않는다:
$ uname -a
Linux ibse-VirtualBox 5.8.0-50-generic #56~20.04.1-Ubuntu SMP Mon Apr 12 21:46:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
$
그래서 내 질문은 다음과 같습니다
- 그것은 무엇에 달려 있습니까? 그런 점에서 영향을 받은 것 같아요소켓()실행 파일에서 직접 호출되지 않고 올바르게 이해하면 libc.so에서 호출되는 getpwuid()에서 호출됩니다.
- Ubuntu에서와 마찬가지로 CentOS에서도 동일한 동작을 달성하려면 어떻게 해야 합니까? libc의 간접 호출을 가로채고 싶지 않습니다.