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
典型的,额外的节(那些没有相应段的节)用于存放调试信息、符号表等等。
【编辑推荐】