好的我明白了。当另一个 libc 函数调用它时,您不能用 LD_PRELOAD 覆盖一个 libc 函数。
我在玩 Dante socksifier,发现它不适用于 bash /dev/udp FD。然后我用这个函数写了一个简单的 .so 文件write
,它也不适用于 bash
libtest.c
:
#include <unistd.h>
ssize_t write(int fildes, const void *buf, size_t nbyte)
{
return nbyte;
}
test.c
:
#include <unistd.h>
int main(int argc, char *argv[]) {
write(1,"abc\n",4);
return 0;
}
_
$ gcc -g -O0 -fPIC -shared -o libtest.so libtest.c
$ gcc -g -O0 -o test test.c
$ ./test
abc
$ LD_PRELOAD=./libtest.so ./test
$ LD_PRELOAD=./libtest.so bash -c 'echo abc'
abc
upd:根据 ensc,它与符号版本有关。
链接 ./test 需要改变什么,这样它就会像 bash 一样失败?我的意思是,对于相同的 .so 文件,命令:$ LD_PRELOAD=./libtest.so ./test
会打印“abc”,因为test
会绑定到write
glibc 中的版本。
我也在尝试相反的方法 - 使用版本化的 .so 文件制作 .so 文件write
。version.script
:
GLIBC_2.2.5 {
write;
};
但我的图书馆仍然无法write
在 bash中拦截
$ gcc -g -O0 -fPIC -shared -Wl,--version-script=./version.script -o libtest.so libtest.c
$ LD_PRELOAD=./libtest.so bash -c 'echo abc'
abc