Ubuntu 및 CentOS에서 LD_PRELOAD를 통해 라이브러리 함수를 연결할 때 동작의 차이점

Ubuntu 및 CentOS에서 LD_PRELOAD를 통해 라이브러리 함수를 연결할 때 동작의 차이점

후크 기능이 있습니다소켓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
$

그래서 내 질문은 다음과 같습니다

  1. 그것은 무엇에 달려 있습니까? 그런 점에서 영향을 받은 것 같아요소켓()실행 파일에서 직접 호출되지 않고 올바르게 이해하면 libc.so에서 호출되는 getpwuid()에서 호출됩니다.
  2. Ubuntu에서와 마찬가지로 CentOS에서도 동일한 동작을 달성하려면 어떻게 해야 합니까? libc의 간접 호출을 가로채고 싶지 않습니다.

관련 정보