Linux及安全实践四——ELF文件格式分析

一、ELF文件格式概述

1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西、以及都以什么样的格式去放这些东西。

二、分析一个ELF文件

以一个最简单的helloworld程序为例

1. ELF文件头

使用工具查看ELF文件头:readelf -h obj

在/usr/include/elf.h中可以找到文件头结构定义:

大小总共为64字节,换算成十六进制为0x40。在十六进制代码中找到前0x40字节,即为文件头信息部分(阅读时注意反序问题):

(1)identification

第一部分:占四个字节。7f 45 4c 46,对应ASCII码.ELF,表示这是一个ELF对象。

第二部分:占一个字节。02表示是一个64位对象。

第三部分:占一个字节。01表示是小端表示法。

第四部分:占一个字节。01表示文件头版本。

其余默认为0。

(2)information

e_type:两个字节,01 00表示是一个重定位文件。

e_machine:两个字节,3e 00表示是intel80386处理器体系结构。

e_version:四个字节,01 00 00 00表示是当前版本。

e_entry:八个字节,00 00 00 00 00 00 00 00表示当前程序没有入口点。

e_phoff:八个字节,00 00 00 00 00 00 00 00表示没有程序头表。

e_shoff:八个字节,90 02 00 00 00 00 00 00表示段表的偏移地址在00 00 00 00 00 00 02 90处。

e_flags:四个字节,00 00 00 00表示未知处理器特定标志#define EF_SH_UNKNOWN 0x0。

e_ehsize:两个字节,40 00表示elf文件头大小为00 40(64个字节)。

e_phentsize:两个字节,00 00表示重定位文件没有程序头表。

e_phnum:两个字节,00 00表示重定位文件没有程序头表。

e_ehentsize:两个字节,40 00 表示段头大小为00 40(64字节),section header table中每个header的大小。

e_shnum:两个字节,0d 00表示段表入口有13个,即段表有13段。

e_shstrndx:两个字节,0a 00 表示段表字符串在段表中的索引号,.shstrab段的段表索引号为00 0a,即10。

2. 通过文件头找到各个节

使用工具查看段表信息:readelf -S obj

(1)找到段表

在文件头中e_shoff可以找到段表偏移地址00 00 00 00 00 00 02 90,从这个地址去查找段表。

段表长度由e_ehentsize为00 40(64字节)。

段表个数由e_shnum可知有13个。

/usr/include/elf.h中可以找到段表结构:

(2)分析一个段表

第一个段:全为零,不表示任何段。

第二个段:

sh_name:四个字节,20 00 00 00表示该段名称在.shstrtab中偏移量,为.test节。

sh_type:四个字节,01 00 00 00表示这个段拥有程序所定义的信息,其格式和含义完全由该程序确定,这里表示PROGBITS。

sh_flags:八个字节,06 00 00 00 00 00 00 00表示alloc和execute。

sh_addr:八个字节,00 00 00 00 00 00 00 00表示是section在内存中的虚拟地址,.o文件不需要执行,这里都是0。

sh_offset:八个字节,40 00 00 00 00 00 00 00表示是section与文件头之间的偏移。

sh_size:八个字节,11 00 00 00 00 00 00 00表示文件里面section占用的大小。

sh_link:四个字节,00 00 00 00表示没有链接信息。

sh_info:四个字节,00 00 00 00表示没有辅助信息。

sh_addralign:八个字节,01 00 00 00 00 00 00 00表示字节对齐长度。

sh_entsize:八个字节,00 00 00 00 00 00 00 00表示没有入口。(3)所有段表

第三个段:

段名:.rel.text

类型:RELA

标志:info

相对文件头偏移:0x1e0

占用大小:0x30

第四个段:

段名:.data

类型:PROGBITS

标志:write、alloc

相对文件头偏移:0x51

占用大小:0

第五个段:

段名:.bss

类型:NOBITS

标志:write、alloc

相对文件头偏移:0x51

占用大小:0

第六个段:

段名:.rodata

类型:PROGBITS

标志:alloc

相对文件头偏移:0x51

占用大小:0x0b

第七个段:

段名:.comment

类型:PROGBITS

标志:merge、strings

相对文件头偏移:0x5c

占用大小:0x26

第八个段:

段名:.note.GNU-stack

类型:PROGBITS

标志:无

相对文件头偏移:0x82

占用大小:0

第九个段:

段名:.eh_frame

类型:PROGBITS

标志:alloc

相对文件头偏移:0x88

占用大小:0x38

第十个段:

段名:.rela.eh_frame

类型:RELA

标志:info

相对文件头偏移:0x210

占用大小:0x18

第十一段:

段名:.shstrtab

类型:STRTAB

标志:无

相对文件头偏移:0x228

占用大小:0x61

第十二段:

段名:.symtab

类型:STRTAB

标志:无

相对文件头偏移:0xc0

占用大小:0x0108

第十三段:

段名:.strtab

类型:STRTAB

标志:无

相对文件头偏移:0x1c8

占用大小:0x11

三、理解常见节

1. .text节:本节中是可执行指令的集合

通过刚才的信息,我们可以从文件中偏移0x40处找到大小为0x11的 .text节:

可以通过反汇编该程序来查看:

2. .rodata:本节是只读数据,ro代表read only

从偏移0x51处找到大小为0x0b的 .rodata节:

使用ASCII码对照表翻译数据为hello 5309,即.c文件中的字符串:

2. .comment:本节用来存放编译器版本信息

从偏移0x5c处找到大小为0x26的 .comment节:

3. .symtab:本节存放所有section中定义的符号名字,一般是变量、函数shstrtab及symtab经常引用strtab中的字符串

从偏移0xc0处找到大小为0x0108的 .symtab节:

4. .strtab:本节是段表的字符串表

从偏移0x1c8处找到大小为0x11的 .strtab节:

数据用“0”分隔出了三部分,用ASCII码翻译:

65 6c 66 2e 63:elf.c

6d 61 69 6e:main

70 75 74 73:puts

Linux及安全实践四——ELF文件格式分析的更多相关文章

  1. Linux课题实践四——ELF文件格式分析

    2.4   ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...

  2. 20135218 实践四 ELF文件格式分析

    一 :概述 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: (1)可重定向文件:文 ...

  3. linux第三次实践:ELF文件格式分析

    linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...

  4. Linux实践:ELF文件格式分析

    标签(空格分隔): 20135321余佳源 一.基础知识 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...

  5. 20135337——linux实践三:ELF文件格式分析(32位系统)

    ELF文件格式分析 可重定位文件 十六进制形式显示内容 显示各个段.符号表相关信息 查看各个段信息 elf文件头信息 段表 符号表信息 查看堆栈 具体分析 1.ELF文件头信息(小字节优先,均十六进制 ...

  6. 实践2.4 ELF文件格式分析

    实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...

  7. linux实践之ELF文件分析

    linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...

  8. 20135306 2.4 ELF文件格式分析

    2.4   ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...

  9. Linux课程实践四:ELF文件格式分析

    一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...

随机推荐

  1. 服务治理-> Spring Cloud Eureka

    服务治理->搭建服务注册中心 服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务 实例的自动化注册与发现. 为什么我们在微服务架构中那么需要服务治理模块呢?微服务 系统 ...

  2. MySQL两种引擎的比较

    MyISAM,InnoDB主要区别: 1.MyISAM是非事物安全的,InnoDB是事物安全的. 事物安全的特点为更安全,遇到问题会自动恢复或从备份加事物日志回复,如果更新失败,你的所有改变都变回原来 ...

  3. 分享一篇IBN(Intent-based networking)调研报告

    IBN调研报告 背景 SDN(Software-defined network):最大特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明.具有灵活的软件 ...

  4. DevOps on AWS之Cloudformation实践篇

    cloudformation入门实践 AWS cloudformation通过模板对AWS云资源进行编排和调用.并且可以通过模板代码层面的修改就可以对现有环境进行升级改造,云端业务的灵活便捷特点展现无 ...

  5. SSZipArchive解压失败的原因

    SSZipArchive 解压失败的原因是路径不对解压失败后,修正路径后再次解压就会出现解压失败的情况,代理方法也不会走也没有日志输出.解决方法就是删除手机上的软件再次运行就可以了.这个问题也就在内部 ...

  6. OO第二阶段作业总结

    第五次作业:         设计策略: 本次作业设计的基本思路是按照指导书所给的推荐方法来完成的,即共用对象为队列盘,线程有电梯.调度器.以及扫描器,扫描器将控制台输入的有效指令加入到队列盘中,调度 ...

  7. Chapter 2 软件过程

    软件发展前期,人们只重视结果而忽略了过程,随着技术的成熟,软件过程的重要性被日益发觉.软件过程是软件工程人员为了获得软件产品而在软件工具的支持下实施的一系列软件工程活动. 软件过程的基本活动包括问题提 ...

  8. WebGL学习笔记四点二

    前几章对图形图形内部多是 以纯色填充,但是现实中已经有许多好的图片了我们没必要一点点画,这一章第五章就是将图片以纹理的形式加载到片元中,主要过程如下,首先是定义点的坐标的attribute变量用于在j ...

  9. Cosplay之孩子的妈咪

    很荣幸的担任“孩子妈妈”的角色,站在父母的角度去思考怎样的一个四则运算的APP才算是符合要求,可以受到广大家长的喜爱.不外乎有这样一些功能:1.可以随时的给孩子出题目,而且可以很快的得出正确答案.分析 ...

  10. Software Defined Networking(Week 3, part 1)

    Control and Data Plane Seperation 课程地址 Overview 今天正式地学习一个控制与数据平面分离.学习完本节,应该要掌握何为控制和数据平面,了解它们的功能以及好处, ...