1. 程式人生 > >一種簡單的hook方法--LD_PRELOAD變量

一種簡單的hook方法--LD_PRELOAD變量

返回結果 其他 深入 分系統 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變量