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 | //target.c |
1 | //hack.c |
把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表示生成一个共享库。
target.c的编译就略过了
最后执行
1 | LD_PRELOAD=./hack.so ./target |
已经成功hook掉了
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !