LD_PRELOAD

Posted by Humb1e on 2023-04-22
Estimated Reading Time 1 Minutes
Words 478 In Total
Viewed Times

LD_PRELOAD

Linux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取到的动态链接库文件进行预加载。即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被加载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。

基于这样的一个情况,我们就可以实现基于LD_PRELOAD的hook技术。

我们可以自己编写一个.so文件,并且在目标程序运行的时候加载进去,因为LD_PRELOAD的优先级是高于自带的库的,所以我们就可以实现对特定函数的修改。

实验的时候做了两个简单的小程序,hook掉了printf函数,将printf函数的输出变成了hacked_by_humb1e

1
2
3
4
5
6
7
//target.c
#include <stdio.h>
int main()
{
printf("%s 向你问好!\n", "ConsoleApplication1");
return 0;
}
1
2
3
4
5
6
//hack.c
#include<stdio.h>
int printf(const char* __restrict __fmt, ...) {
puts("hacked_by_humb1e");
return 0;
}//因为被hook的函数里不能调用自己,所以用puts代替了printf

把hack.c编译为二进制文件:

1
$ gcc -c -fPIC hack.c -o hack.o      

-c表示只编译(compile),而不连接。-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件mylib.o。

注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。

生成共享库:

1
$ gcc -shared hack.o -o hack.so 

共享库文件以.so为后缀。-shared表示生成一个共享库。

image-20230422233444639

target.c的编译就略过了

最后执行

1
LD_PRELOAD=./hack.so ./target

image-20230422233540709

已经成功hook掉了


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !