searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux平台软件逆向分析的原理介绍(一)

2024-05-22 03:16:21
5
0
一、ELF文件结构
1.ELF一般用于可执行文件、对象文件、共享库及核心转储文件。ELF格式和PE格式是Linux和Windows操作系统上使用最广泛的二进制格式,Android是odex。
 
2.ELF目标文件的作用有两个,一是用于构建程序,构建动态链接库或可执行程序,主要体现在链接的过程;二是用于运行程序。在这两种情况下,我们可以从不同的视角来看待同一个目标文件。对于同一个目标文件,当它分别被用于链接和用于执行的时候,其特性是不一样的,我们所关注的内容也不一样。
 
3.从本质上讲,ELF二进制文件包含4种类型的组件:ELF头部(executable header,也称为可执行文件头)、一系列(可选)程序头、多个节以及节对应的各个(可选)节头。所有的数据结构都定义在elf.h中。
  • ELF 文件头(File Header):位于文件最开始,包含了整个文件的结构信息,例如ELF幻数,ELF文件类型,程序头表、节头表的address等。
  • 程序头表(Program Header Table):描述了所有段的信息。
  • 节头表(Section Header Table):描述了所有节的信息
  • 节 (section) :专用于连接过程而言的,在每个“节”中包含有指令数据、符号数据、重定位数据等。
.interp---指定用于加载二进制文件的解释器路径(readelf -p .interp xxx)
.rodata---用于存放只读数据,一般是程序里面的只读变量(如const修饰的变量)和字符串常量。比如字符串常量,全局const变量 和 #define定义的常量。
.data---主要保存了已经初始化的变量,通常是指用来存放程序中已初始化的全局变量和已初始化的静态变量的一块内存区域。
.text---本节包含程序指令代码,所以它是二进制文件分析或者逆向工作的重点。
.bss---主要保存了未初始化的变量,这里的未初始化起始也包括初始化为 0 的变量。通常是指用来存放程序中未初始化的全局变量和未初始化的局部静态变量。一般情况下,可执行程序在开始运行的时候,系统会把这一段内容清零。
.symtab/.dynsym---都是含有动态连接符号表。例如函数、变量等都是符号,甚至 .dynsym 是 .symtab 的子集,但是他们的作用不太一样。.symtab,俗称的符号表,记录了所有符号,不管是自己定义的变量、函数,还是未定义需要动态库提供实现的所有符号。.dynsym,动态链接才需要的符号表,即可包括对外提供调用的符号,也包括需要外面提供实现的符号。
.got---此节包含全局偏移量表。
.plt---此节包含函数链接表。
 
4.一般C语言的编译后执行语句都编译成机器代码,保存在.text段;已初始化的全局变量和局部静态变量都保存在. data段;未初始化的全局变量和局部静态变量一般放在一个叫.“bss”的段里。“.bss”段在目标文件和可执行文件中并不占用文件的ROM空间,但是它在装载时才会从内存分配空间,占用内存空间。
 
 
更多ELF文件静态结构定义细节请查阅书籍《ELF格式解析》、《二进制分析实战》、elf.h文件等
0条评论
0 / 1000
x****n
1文章数
0粉丝数
x****n
1 文章 | 0 粉丝