原創
本文**:
發布日期:2015 年 06月 22日
ld_preload是linux系統的乙個環境變數,它可以影響程式的執行時的鏈結(runtime linker),它允許你定義在程式執行前優先載入的動態鏈結庫。這個功能主要就是用來有選擇性的載入不同動態鏈結庫中的相同函式。通過這個環境變數,我們可以在主程式和其動態鏈結庫的中間載入別的動態鏈結庫,甚至覆蓋正常的函式庫。一方面,我們可以以此功能來使用自己的或是更好的函式(無需別人的原始碼),而另一方面,我們也可以以向別人的程式注入程式,從而達到特定的目的。
// myverifypasswd.c
#include #include #include "mystrcmp.h"
void main(int argc,char **ar**)
if (!mystrcmp(passwd,ar**[1]))
printf("invalid password!\n");
}
// mystrcmp.h
#include int mystrcmp(const char *s1, const char *s2);
// mystrcmp.c
#include #include #include "mystrcmp.h"
int mystrcmp(const char *s1, const char *s2)
gcc mystrcmp.c -fpic -shared -o libmystrcmp.so #編譯動態鏈結庫
gcc myverifypasswd.c -l. -lmystrcmp -o myverifypasswd #編譯主程式
export ld_library_path=/home/n6/桌面/ld_preload #指定動態鏈結庫所在目錄位置
ldd myverifypasswd #顯示、確認依賴關係
./myverifypasswd #執行主程式myverifypasswd
n6@x240s:~/桌面/ld_preload$ gcc mystrcmp.c -fpic -shared -o libmystrcmp.so
n6@x240s:~/桌面/ld_preload$ gcc myverifypasswd.c -l. -lmystrcmp -o myverifypasswd
n6@x240s:~/桌面/ld_preload$ export ld_library_path=/home/n6/桌面/ld_preload
n6@x240s:~/桌面/ld_preload$ ldd myverifypasswd
linux-vdso.so.1 => (0x00007ffedc1bd000)
libmystrcmp.so => /home/n6/桌面/ld_preload/libmystrcmp.so (0x00007eff99a7f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff99698000)
/lib64/ld-linux-x86-64.so.2 (0x000056269aba4000)
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd
usage: ./myverifypasswd n6@x240s:~/桌面/ld_preload$ ./myverifypasswd abc
invalid password!
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd password
correct password!
// myhack.c
#include #include int mystrcmp(const char *s1, const char *s2)
gcc myhack.c -fpic -shared -o myhack.so #編譯替換庫
export ld_preload="./myhack.so" #設定ld_preload環境變數,庫中的同名函式在程式執行時優先呼叫
./myverifypasswd #執行主程式
n6@x240s:~/桌面/ld_preload$ gcc myhack.c -fpic -shared -o myhack.so
n6@x240s:~/桌面/ld_preload$ export ld_preload="./myhack.so"
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd
usage: ./myverifypasswd n6@x240s:~/桌面/ld_preload$ ./myverifypasswd abc
hack function invoked. s1=s2=correct password!
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd password
hack function invoked. s1=s2=correct password!
n6@x240s:~/桌面/ld_preload$ unset ld_preload
定義與目標函式完全一樣的函式,包括名稱、變數及型別、返回值及型別等將包含替換函式的原始碼編譯為動態鏈結庫
通過命令
export ld_preload="庫檔案路徑"
,設定要優先替換動態鏈結庫如果找不替換庫,可以通過
export ld_library_path=庫檔案所在目錄路徑
,設定系統查詢庫的目錄替換結束,要還原函式呼叫關係,用命令
unset ld_preload
解除想查詢依賴關係,可以用
ldd 程式名稱
學習LD PRELOAD之摘抄
一 ld preload是什麼 ld preload是linux系統的乙個環境變數,它可以影響程式的執行時的鏈結 runtime linker 它允許你定義在程式執行前優先載入的動態鏈結庫。這個功能主要就是用來有選擇性的載入不同動態鏈結庫中的相同函式。通過這個環境變數,我們可以再主程式和其動態鏈結庫...
Swizzling 偷梁換柱的黑魔法!
我們知道,oc是一門動態執行時語言。我們也知道,oc中的函式呼叫本質上其實是訊息的傳送 objc msgsend someobject,selector methodname parameters 所有要呼叫的函式,編譯階段是無法確定的,只有到執行的時候才能確定!正因為有此特性,所以在執行階段,我們...
使用LD Preload的Linux許可權公升級技巧
共享庫是程式在啟動時載入的庫。正確安裝共享庫後,之後啟動的所有程式將自動使用新的共享庫。每個共享庫都有乙個名為soname的特殊名稱。soname有字首lib,庫的字尾名為.so,後跟句號和版本號。動態鏈結器可以通過執行一些動態鏈結的程式或共享物件來間接執行。程式ld.so和ld linux.so ...