在unix作業系統的動態鏈結庫的世界中,ld_preload就是這樣乙個環境變數,它可以影響程式的執行時的鏈結(runtime linker),它允許你定義在程式執行前優先載入的動態鏈結庫。
這個功能主要就是用來有選擇性的載入unix作業系統不同動態鏈結庫中的相同函式。通過這個環境變數,我們可以在主程式和其動態鏈結庫的中間載入別的動態鏈結庫,甚至覆蓋正常的函式庫。一方面,我們可以以此功能來使用自己的或是更好的函式(無需別人的原始碼),而另一方面,我們也可以以向別人的程式注入惡意程式,從而達到那不可告人的罪惡的目的。
我們知道,linux的用的都是glibc,有乙個叫libc.so.6的檔案,這是幾乎所有linux下命令的動態鏈結中,其中有標準c的各種函式。unix作業系統中對於gcc而言,預設情況下,所編譯的程式中對標準c函式的鏈結,都是通過動態鏈結方式來鏈結libc.so.6這個函式庫的。
ok。還是讓我用乙個例子來看一下用ld_preload來hack別人的程式。
unix作業系統ld_preload示例一
我們寫下面一段例程:
/* 檔名:verifypasswd.c */
/* 這是一段判斷使用者口令的程式,其中使用到了標準c函式strcmp*/
#include在上面這段unix作業系統程式中,我們使用了strcmp函式來判斷兩個字串是否相等。下面,我們使用乙個動態函式庫來過載strcmp函式:<
stdio.h
>
#include
<
string.h
>
int main(int argc, char **argv)
if (!strcmp(passwd, argv[1]))
printf("invalid password!\n");
}
/* 檔名:hack.c */編譯程式:#include
<
stdio.h
>
#include
<
string.h
>
int strcmp(const char *s1, const char *s2)
$ gcc -o verifypasswd verifypasswd.c$ gcc -shared -o hack.so hack.c
測試一下程式:(得到正確結果)
$ ./verifypasswd asdf設定ld_preload變數:(使我們重寫過的strcmp函式的hack.so成為優先載入鏈結庫)invalid password!
$ export ld_preload="./hack.so"
再次執行程式:
$ ./verifypasswd asdf1)我們的hack.so中的strcmp被呼叫了。hack function invoked. s1=
<
password
>s2=
<
asdf
>
correct password!
2)主程式中執行結果被影響了。
如果這是乙個unix作業系統登入程式,那麼這也就意味著我們用任意口令都可以進入unix作業系統了。
登入 Unix 作業系統
上一節我們了解 unix 作業系統發展歷史,這一節我們來了解 unix 的啟動,如何優雅的登入和退出 unix。系統啟動 系統是指系統從關機狀態開始直到系統變為使用者可用狀態。首先引導程式查詢有哪些裝置 硬碟,光碟,優盤等 是可以引導的,然後選擇可以引導的裝置。接著引導程式將控制權轉移給核心,核心呼...
Unix類作業系統入門
由於unix作業系統眾所周知的穩定性 可靠性,用來提供各種internet服務的計算機執行的作業系統佔很大比例的是unix及unix類作業系統,因此需要大量熟練掌握unix類作業系統應用的人才。目前比較常見的執行在pc機上的unix類作業系統有 linux bsd unix solaris x86 ...
unix作業系統與linux作業系統的區別
unix是乙個大公司實驗室做的,at t公司的實驗員,開始是屌絲自己玩著做的免費的,後來發現能產金商業化了,變成高富帥產品了。屌絲沒的用了,鬱悶了,於是山寨了乙個,名字也差不多,就叫linux,小的unix。因為也是小孩玩出來的,所以開始的功能比較少,因為屌絲仇富,所以堅持免費!後來改叫自由軟體了,...