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