Unix系統(tǒng)插入寄生代碼知識講解
Unix系統(tǒng)為了插入寄生代碼,必須保證原來的代碼不被破壞,因此需要擴展相應(yīng)段所需內(nèi)存。文本段事實上不僅僅包含代碼,還有 ELF 頭,其中包含動態(tài)鏈接信息等等。
如果Unix系統(tǒng)直接擴展文本段插入寄生代碼,帶來的問題很多,比如引用絕對地址等問題。可以考慮保持文本段不變,額外增加一個段存放寄生代碼。然而引入一個額外的段的確容易引起懷疑,很容易被發(fā)現(xiàn)。
向高端擴展文本段或者向低端擴展數(shù)據(jù)段都有可能引起段重疊,在內(nèi)存中重定位一個段又會使那些引用了絕對地址的代碼產(chǎn)生問題。可以考慮向高端擴展數(shù)據(jù)段,這不是個好主意,有些Unix系統(tǒng)完整地實現(xiàn)了內(nèi)存保護(hù)機制,數(shù)據(jù)段是不可執(zhí)行的。
段邊界上的頁填充提供了插入寄生代碼的地方,只要空間允許。在這里插入寄生代碼不破壞原有段內(nèi)容,不要求重定位。文本段結(jié)尾處的頁填充是個很好的地方,***看上去象下面這個樣子:
關(guān)鍵字:
[...] 一個完整的頁
V 寄生代碼
T 文本段內(nèi)容
D 數(shù)據(jù)段內(nèi)容
P 填充
頁號
#1 [TTTTTTTTTTTTVVPP] <-- 文本段
#2 [PPPPDDDDDDDDPPPP] <-- 數(shù)據(jù)段
一個更完整的ELF可執(zhí)行布局如下:
- ELF Header
- Program header table
- Segment 1
- Segment 2
- Section header table
- Section 1
- .
- .
- Section n
典型的,額外的節(jié)(那些沒有相應(yīng)段的節(jié))用于存放調(diào)試信息、符號表等等。
【編輯推薦】