LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。程序中我们经常要调用一些外部库的函数,以open()和execve()为例,如果我们有个自定义这两函数,把它编译成动态库后,通过LD_PRELOAD加载,当程序中调用open函数时,调用的其实是我们自定义的函数,下面以一个例子说明。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
execve("/bin/date","",NULL);
if(fd=open("/home/songqiang/system_hook/hello.c",O_RDONLY)!=-1)
{
fprintf(stdout,"openfile successed!\n");
}
else
{
fprintf(stderr,"openfile error!\n");
}
close(fd);
return 0;
}
在没有加载动态链接库前,结果显示:
/*
hack.c
功能:对open(),execve()进行劫持
作者:SQ
*/
extern int __open(char *,int,int);
//参数3:环境设备配置
extern int execv(char *,char *[],char *envp[]);
//打开文件
int open(char * path,int flags,int mode)
{
//输出打开的文件名
printf("open :%s\n",path);
return __open(path,flags,mode);
}
//启动程序
int execve(char * path,char* args[],char * envp[])
{
printf("execv :%s\n",path);
return execv(path,args,envp);
}
加载动态链接库后:
gcc -fpic -c -ldl hack.c
gcc -shared -lc -o hack.so hack.o
export LD_PRELOAD=./hack.so //加载库
export LD_PRELOAD=NULL; //卸载库
结果显示:
怎么让普通用户拥有root权限,可以实现reboot
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
uid_t geteuid(void){return 0;}
uid_t getuid(void){return 0;}
uid_t getgid(void){return 0;}
加载进去前:
加载后: