一种简单的hook方法--LD_PRELOAD变量
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 1014 level13@nebula:/tmp$ id uid=1014(level13) gid=1014(level13) groups=1014(level13)
运行后确实拿到了当前用户的uid,下面就通过LD_PRELOAD变量来劫持系统原来的getuid函数,从而改变返回结果
一、编写恶意getuid()函数
//muid.c #include<sys/types.h> uid_t getuid(void) { return 1000; }
//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 1000
可以看到这里getuid函数已经被劫持了,返回了我们想要的uid值,顺利hook该函数
我们也可以加入更多恶意代码,比如返弹shell等,经过测试,这种方式可以劫持大部分系统函数,其他理由有待深入挖掘