LD PRELOAD的偷梁換柱之能

2021-09-26 02:29:40 字數 3047 閱讀 1189

原創

本文**:

發布日期: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 ...