Unix作業系統LD PRELOAD簡介

2021-06-13 04:41:14 字數 1696 閱讀 9497

在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 

<

stdio.h

>

#include 

<

string.h

>

int main(int argc, char **argv)   

if (!strcmp(passwd, argv[1]))   

printf("invalid password!\n");  

}

在上面這段unix作業系統程式中,我們使用了strcmp函式來判斷兩個字串是否相等。下面,我們使用乙個動態函式庫來過載strcmp函式:

/* 檔名: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  

invalid password! 

設定ld_preload變數:(使我們重寫過的strcmp函式的hack.so成為優先載入鏈結庫)

$ export ld_preload="./hack.so"

再次執行程式: 

$ ./verifypasswd  asdf  

hack function invoked. s1=

<

password

>s2=

<

asdf

>

correct password! 

1)我們的hack.so中的strcmp被呼叫了。

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。因為也是小孩玩出來的,所以開始的功能比較少,因為屌絲仇富,所以堅持免費!後來改叫自由軟體了,...