几种常见的ELF文件在Linux下,我们经gcc编译之后生成的可执行文件属于ELF文件: ELF是一类文件类型,而不是特指某一后缀的文件。ELF(Executable and Linkable Format,
ELF格式可结构大致为: (图片来源:百度百科) ELF文件由4部分组成,分别是 实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。 readelf工具的使用在Linux下,我们可以使用 下面我们先准备一个动态链接相关的demo,就拿我们之前分享的文章:静态链接与动态链接补充(Linux)中的demo来做演示: 文件1(main.c): #include "test.h" 文件2(test.c): #include "test.h" 文件3(test.h): #ifndef __TEST_H 执行相关命令生成相关文件: 下面我们使用 readelf <option(s)> elf-file(s) 查看可执行文件头部信息: 查看可执行文件头部信息是,我们发现这样一个问题,头部信息中的类型竟然是共享库文件,而我们查看的是可执行文件,自相矛盾? 查了一些资料:
发现:gcc编译默认加了 Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。 标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。 PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。 引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。 类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小。 也就是说,pie这是一种保护我们可执行程序的一种手段。这里我们只是做实验,我们可以加 可以看到,类型终于对得上了。ELF头部信息还包含有Entry point address(入口地址)、Start of program headers(程序头的起始字节)、Start of section headers(节头的起始字节)等信息。 查看可重定位文件头部信息: 查看共享目标文件头部信息: 同样的, objdump工具的使用objdump工具用于显示一个或多个目标文件的信息。objdump命令格式:
可执行文件、可重定位文件与共享目标文件都属于目标文件,所以都可以使用这个命令来查看一些信息。 查看可重定位文件反汇编信息: 查看可执行文件反汇编信息: 查看共享目标文件反汇编信息: 总结以上就是本次的分享。简单地介绍了ELF文件的一些信息,同时介绍了分析ELF文件的两个工具。 ELF文件的内容很多,并且比较抽象,详细分析起来是个深坑。我们大致先进行一个简单的了解,之后如果深入学习时再做另外的分享。 以上就是本次的分享,如有错误,欢迎指出!谢谢 欢迎大家进群交流、共同进步。同时,我也会关注一些大家问的一些问题,从中挑选一些具有代表性的、并且在我知识范围内的问题写出相关文章做分享。 |
|