為什么要這么做呢?如果把動態(tài)鏈接相關(guān)的代碼也放到內(nèi)核中,就會導(dǎo)致內(nèi)核執(zhí)行功能過多 , 內(nèi)核的理念一直是能不在內(nèi)核中執(zhí)行的就不在內(nèi)核中處理,以避免出現(xiàn)問題時難以更新而且影響系統(tǒng)整體的穩(wěn)定性 。事實上內(nèi)核中對ELF文件結(jié)構(gòu)的支持是相當(dāng)有限的,只能讀取并理解部分的字段 。
用戶空間內(nèi)核返回用戶空間后,對于靜態(tài)鏈接的程序是直接執(zhí)行,沒什么好說的 。而對于動態(tài)鏈接的程序,實際是執(zhí)行interpreter的代碼 。ELF的interpreter作為一個段,自然是編譯鏈接的時候加進去的,因此和編譯使用的工具鏈有關(guān) 。對于Linux系統(tǒng)而言,使用的一般是GCC工具鏈 , 而interpreter的實現(xiàn),代碼就在glibc的 elf/rtld.c 中 。
interpreter又稱為dynamic linker , 以glibc2.27為例,它的大致功能如下:
將實際要執(zhí)行的ELF程序中的內(nèi)存段加載到當(dāng)前進程空間中;將動態(tài)庫的內(nèi)存段加載到當(dāng)前進程空間中;對ELF程序和動態(tài)庫進行重定向操作(relocation);調(diào)用動態(tài)庫的初始化函數(shù)(如 .preinit_array, .init, .init_array );將控制流傳遞給目標ELF程序,讓其看起來自己是直接啟動的;其中參與動態(tài)加載和重定向所需要的重要部分就是Program Header Table中 PT_DYNAMIC 類型的Segment 。前面我們提到在Section Header中也有一部分參與動態(tài)鏈接的section,即 .dynamic。我在自己解析動態(tài)鏈接文件的時候發(fā)現(xiàn),實際上 .dynamic section中的數(shù)據(jù) , 和 PT_DYNAMIC 中的數(shù)據(jù)指向的是文件中的 同一個地方 ,即這兩個entry的s_offset和p_offset是相同 。每個元素的類型如下:
typedef struct{Elf32_Sword d_tag;/* Dynamic entry type */union{Elf32_Word d_val;/* Integer value */Elf32_Addr d_ptr;/* Address value */} d_un;} Elf32_Dyn;d_tag表示實際類型,并且d_un和d_tag相關(guān),可能說是很有拓展性了:) 同樣的,標準中定義了幾十個d_tag類型,比較常用的幾個如下:
DT_NULL: 表示_DYNAMIC的結(jié)尾DT_NEEDED: d_val保存了一個到字符串表頭的偏移,指定的字符串表示該ELF所依賴的動態(tài)庫名稱DT_STRTAB: d_ptr指定了地址保存了符號、動態(tài)庫名稱以及其他用到的字符串DT_STRSZ: 字符串表的大小DT_SYMTAB: 指定地址保存了符號表DT_INIT/DT_FINI: 指定初始化函數(shù)和結(jié)束函數(shù)的地址DT_RPATH: 指定動態(tài)庫搜索目錄DT_SONAME: Shared Object Name,指定當(dāng)前動態(tài)庫的名字( logical name )其中有部分的類型可以和Section中的 SHT_xxx 類型進行類比 , 完整的列表可以參考ELF標準中的 Book III: Operating System Specific 一節(jié) 。
在interpreter根據(jù) DT_NEEDED 加載完所有需要的動態(tài)庫后,就實現(xiàn)了完整進程虛擬內(nèi)存映像的布局 。在尋找某個動態(tài)符號時,interpreter會使用 廣度優(yōu)先 的方式去進行搜索,即先在當(dāng)前ELF符號表中找,然后再從當(dāng)前ELF的 DT_NEEDED 動態(tài)庫中找 , 再然后從動態(tài)庫中的 DT_NEEDED 里查找 。
因為動態(tài)庫本身是位置無關(guān)的(PIE),支持被加載到內(nèi)存中的隨機位置,因此為了程序中用到的符號可以被正確引用 , 需要對其進行重定向操作 , 指向?qū)?yīng)符號的真實地址 。這部分我在之前寫的關(guān)于GOT,PLT和動態(tài)鏈接的文章中已經(jīng)詳細介紹過了,因此不再贅述 , 感興趣的朋友可以參考該文章 。
實際案例有人也許會問,我看你bibi了這么多,有什么實際意義嗎?呵呵,本節(jié)就來分享幾個我認為比較有用的應(yīng)用場景 。
Interpreter Hack在滲透測試中 , 紅隊小伙伴們經(jīng)常能拿到目標的后臺shell權(quán)限,但是遇到一些部署了HIDS的大企業(yè),很可能在執(zhí)行惡意程序的時候被攔截,或者甚至觸發(fā)監(jiān)測異常直接被藍隊拔網(wǎng)線 。這里不考慮具體的HIDS產(chǎn)品,假設(shè)現(xiàn)在面對兩種場景:
推薦閱讀
- ox是什么意思 ox是什么意思英語
- 夢到佛廟 夢到佛廟是什么征兆佛廟
- 夢到死去的陌生人 夢到死去的陌生人是什么意思
- 夢到水潭沒水 夢到水潭沒水什么意思
- 夢到水潭里好多魚 夢到水潭里好多魚什么意思
- 翡翠梅花的寓意是什么,翡翠花的寓意和象征
- 夢到水潭里洗衣服 夢到水潭里洗衣服什么意思
- 睡覺夢到鬼 睡覺夢到鬼是什么預(yù)兆
- 夢到在水潭里走動 夢到在水潭里走動什么意思
- 夢到水潭玩水 夢到水潭玩水什么意思
