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