手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

UNIX/LINUX 平台可执行文档格式分析[转】

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

最后我们讨论ELF文档的动态连接机制。每一个外部定义的符号在全局偏移表(Global Offset Table GOT)中有相应的条目,假如符号是函数则在过程连接表(Procedure Linkage Table PLT)中也有相应的条目,且一个PLT条目对应一个GOT条目。对外部定义函数解析可能是整个ELF文档规范中最复杂的,下面是函数符号解析过程的一个描述。

1:代码中调用外部函数func,语句形式为call 0xaabbccdd,地址0xaabbccdd实际上就是符号func在PLT表中对应的条目地址(假设地址为标号.PLT2)。

2:PLT表的形式如下

.PLT0: pushl 4(離) /* GOT表的地址保存在寄存器ebx中 */
jmp *8(離)
nop; nop
nop; nop
.PLT1: jmp *name1@GOT(離)
pushl $offset
jmp .PLT0@PC
.PLT2: jmp *func@GOT(離)
pushl $offset
jmp .PLT0@PC

3:查看标号.PLT2的语句,实际上是跳转到符号func在GOT表中对应的条目。

4:在符号没有重定位前,GOT表中此符号对应的地址为标号.PLT2的下一条语句,即是pushl $offset,其中$offset是符号func的重定位偏移量。注意到这是个二次跳转。

5:在符号func的重定位偏移量压栈后,控制跳到PLT表的第一条目,把GOT[1]的内容压栈,并跳转到GOT[2]对应的地址。

6:GOT[2]对应的实际上是动态符号解析函数的代码,在对符号func的地址解析后,会把func在内存中的地址配置到GOT表中此符号对应的条目中。

7:当第二次调用此符号时,GOT表中对应的条目已包含了此符号的地址,就可直接调用而无需利用PLT表进行跳转。

动态连接是比较复杂的,但为了获得灵活性的代价通常就是复杂性。其最终目的是把GOT表中条目的值修改为符号的真实地址,这也可解释节.got包含在可读可写段中。

动态连接是个很重要的进步,这意味着库文档能够被升级、移动到其他目录等等而无需重新编译程式(当然,这不意味库能够任意修改,如函数入参的个数、数据类型应保持兼容性)。从很大程度上说,动态连接机制是ELF格式代替a.out格式的决定性原因。假如说面对对象的编程本质是面对接口(interface)的编程,那么动态连接机制则是这种思想的地一个很典型的应用,具体的讲,动态连接机制和设计模式中的桥接(BRIDGE)方法比较类似,而他的LAZY特性则和代理(PROXY)方法很相似。动态连接操作的细节描述请参阅参考资料 8,9,10,11。通过阅读命令readelf、objdump 的源代码连同参考资料 14中所提及的相关软件源代码,能够对ELF文档的格式有更完全的了解。

总结
不同时期的可执行文档格式深刻的反映了技术进步的过程,技术进步通常是针对解决存在的问题和适应新的环境。早期的UNIX系统使用a.out格式,随着操作系统和硬件系统的进步,a.out格式的局限性越来越明显。新的可执行文档格式COFF在UNIX System VR3中出现,COFF格式相对a.out格式最大变化是多了一个节头表(section head table),能够在包含基础的文本段、数据段、BSS段之外包含更多的段,但是COFF对动态连接和C 程式的支持仍然比较困难。为了解决上述问题, UNIX系统实验室(UNIX SYSTEM Laboratories USL) 研发出ELF文档格式,他被作为应用程式二进制接口(Application binary Interface ABI)的一部分,其目的是替代传统的a.out格式。例如,ELF文档格式中引入初始化段.init和结束段.fini(分别对应构造函数和析构函数)则主要是为了支持C 程式。1994年6月ELF格式出现在LINUX系统上,现在ELF格式作为UNIX/LINUX最主要的可执行文档格式。当然我们完全有理由相信,在将来还会有新的可执行文档格式出现。

上述三种可执行文档格式都很好的体现了设计思想中分层的概念,由一个总的头部刻画了文档的基本要素,再由若干子头部/条目刻画了文档的若干细节。比较一下可执行文档格式和以太数据包中以太头、IP头、TCP头的设计,我想我们能很好的感受分层这一重要的设计思想。参考资料 21从全局的角度讨论了各种文档的格式,并提出一个比较夸张的结论:Everything Is Byte!

最后的题外话:大多数资料中对a.out格式的评价较低,常见的词语有黑暗年代(dark ages)、丑陋(ugly)等等,当然,从现代的观点来看,的确是比较简单,但是假如没有曾的简单何来今天的精巧?正如我们今天能够评价石器时代的技术是ugly,那么将来的人们也能够嘲讽今天的技术是很ugly。我想我们也许应该用更平和的心态来对曾的技术有一个公正的评价。

参考资料


《LINUX VIRUSES - ELF FILE FORMAT》 Marius Van Oers
《A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux 》 breadbox
《The Linux Virus Writing And Detection HOWTO》Alexander Bartolich
《从程式员角度看ELF》Hongjiu Lu alert7(译)
《XCOFF Object File Format》
《Executable and Linkable Format(ELF)》

《elf文档格式 --另一文本方式的elf文档》alert7(译)
《如何修改变态库符号表》wangdb
《分析ELF的加载过程》opera
《Before main() 分析》 alert7
《Linkers & Loaders》John R. Levine
《Running a.out executables on modern Red Hat Linux》
《Cheating the ELF》
《ELF Binary Analysis Tools》
《dbxread.c》
《Manual Reference Pages - A.OUT (5)》
《Linux 下缓冲区溢出攻击的原理及对策》
《Microsoft Portable Executable and Common Object File Format Specification》
《COFF的文档结构》redleaves
《Common Object File Format (COFF)》
《Everything Is Byte》 mala




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!