Linux及安全——ELF实践
Linux及安全——ELF实践
二、通过文件头找到section header table,理解内容
三、通过section header table 找到各section
四、理解常见.text .strtab .symtabl .rodata 等section
1.编写测试文件test.c

2.使用如下命令编译生成test.o文件
gcc -c test.c -o test.o
使用如下命令查看test.o文件的大小
ls -l test.o

得知test.o大小为7340字节
3.使用下面命令,用16进制数字显示test.o的内容
hexdump -x test.o

首先看ELF文件头,打开/usr/include/elf.h


32位系统和64位系统的ELF头结构基本相同,区别在于32位系统的ELF头文件大小是52字节,但是64位系统的ELF头文件是64字节。(十进制的64用十六进制表示是34,我的Ubuntu系统是32位)
4.读取ELF文件头

在 readelf 的输出中:
第 1 行,ELF Header: 指名 ELF 文件头开始。
第 2 行,Magic 魔数,用来指名该文件是一个 ELF 目标文件。第一个字节 7F 是个固定的数;后面的 3 个字节正是 E, L, F 三个字母的 ASCII 形式。
第 3 行,CLASS 表示文件类型,这里是 32位的 ELF 格式。
第 4 行,Data 表示文件中的数据是按照什么格式组织的(大端或小端),不同处理器平台数据组织格式可能就不同,如x86平台为小端存储格式。
第 5 行,当前 ELF 文件头版本号,这里版本号为 1 。
第 6 行,OS/ABI ,指出操作系统类型,ABI 是 Application Binary Interface 的缩写。
第 7 行,ABI 版本号,当前为 0 。
第 8 行,Type 表示文件类型。ELF 文件有 3 种类型,一种是如上所示的Executable可执行文件, 一种是可重定位目标文件(Relocatable file),另外一种是共享库(Shared Library) 。
第 9 行,机器平台类型。
第 10 行,当前目标文件的版本号。
第 11 行,程序的虚拟地址入口点,这里是0x8048310。
第 12 行,程序头开始处,这里是52,表示从地址偏移 0x34 处开始。
第 13 行,section头开始处,这里6100 是十进制,表示从地址偏移 0x17D4 处开始。
第 14 行,是一个与处理器相关联的标志,x86 平台上该处为 0 。
第 15 行,ELF 文件头的字节数,这里为52。
第 16 行,程序头字节数,这里为32。
第 17 行,程序头数量,这里为9个。
第 18 行,sections header 的大小,这里每个 section 头大小为 40 个字节。
第 19 行,一共有多少个 section 头,这里是 31 个。
第 20 行,section 头字符串表索引号,从 Section Headers 输出部分可以看到其内容的偏移在 0x34 处,从此处开始到0x50 结束保存着各个 sections 的名字,如 .data,.text,.bss等。
5.分析过以上之后,我们再来分析用16进制显示的本程序中的ELF头

由于intel x86使用小端法,hexdump -x test.o命令是一次性输出两个字节
第一行:
(对应e_ident[EI_NIDENT]):实际表示内容为7f45 4c46 0101 0100 0000 0000 0000 0000
前四个字节7f45 4c46对应16进制ASCⅡ表是ELF,第一个字节 7F 是个固定的数;接下来的一个字节01表示是一个32位对象(64位表示成02),再接下来的一个字节01表示采用小端法表示,再接下来的一个字节01表示文件头版本,剩下的默认都设置为0.
第二行:
e_type(两个字节)值为0x0002,表示是一个可执行文件。
e_machine(两个字节)值为0x0003,表示是表示386体系文件。
e_version(四个字节)值为0x00000001,和e_ident里面的EI_VERSION含义一样,表示是当前版本号。
e_entry(四个字节)值为0x08048310,表示程序入口地址0x08048310。
e_phoff(四个字节)值为 0x00000034 表示program header table(程序头表)在文件中的偏移量(0x34转化为十进制是52,与上上图吻合)
第三行:
e_shoff(四个字节)值为0x000017d4,表示section header table(段表)在文件中的偏移量(0x17d4转化为十进制是6100)。
e_flags(四个字节)值为0x00000000,表示未知处理器特定标志(#define EF_SH_UNKNOWN 0x0)。
e_ehsize(两个字节)值为0x0034, 表示elf header大小, 其实就是sizeof(Elf32_Ehdr)(转化为十进制为52)。
e_phentsize(两个字节)值为0x0020, 表示每个program header 的大小为0x20。
e_phnum(两个字节)的值为0x0009,表示一共有9个program header。
e_ehentsize(两个字节)值为0x0028表示每个段头大小为40个字节(由这里知道section header table里面每个header的大小)。
第四行:
e_shnum(两个字节)值为0x001f,表示有31个section header(由这里知道段表有13个段)。
e_shstrndx(两个字节)值为0x001c,表示section string table(段名串表)在section header table(段表)中的索引值。(即第几个section描述了section string table的位置和大小),(转化为10进制是28)。
通过对readelf和hexdump十六进制的分析,把它们ELF格式对应了起来。
P.S.32位版本对应ELF文件格式及说明


6.段表(section table)的分析


由刚才分析的ELF头可知,段表从0x000017d4开始,每个节区大小为0x0028,共有0x001f个节区,第0x001c为段名串表的索引号。
段表大小28H*1fH=4d8(H)
0x000017d4+0x4d8=0x00001cac
第一节区(17d4-17fc)

第二节区(17fc-1824)

第三节区(1824-184c)

第四节区(184c-1874)

第五节区(1874-189c)

以此类推……
第六节区到第三十一节区(189c-1cac)



分析比较关键的段,以text段为例:

.text ssection是可执行指令的集合,查询段表可知偏移地址为0x000310,使用hexdump -x test.o命令看.text section的内容
使用命令objdump -d test.o对其进行反汇编,得到汇编代码对应的test.o的elf文件

7.符号表分析
用该指令查看各段信息
readelf test.o



Linux及安全——ELF实践的更多相关文章
- linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...
- 《Linux及安全》实践3.1
<Linux及安全>实践三 ELF格式文件分析 一.基础操作 1.查看大小端.32还是64 由此可以看出,本人实践所用到的是32位Ubuntu,数据存储采用小端法. 2.编写hello.c ...
- 《Linux内核分析》实践4
<Linux内核分析> 实践四--ELF文件格式分析 20135211李行之 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格 ...
- 《Linux及安全》实践3.3
<Linux及安全>实践三 字符集总结与分析 [by lwr] 一.ISO.UCS/UTF.GB系列字符集分析 1.字符集&字符编码 字符集(Charset):是一个系统支持的所有 ...
- 《Linux及安全》实践2
<Linux及安全>实践2 [edited by 5216lwr] 一.Linux基本内核模块 1.1理解什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合. ...
- [转]linux,windows 可执行文件(ELF、PE)
ELF (Executable Linkable Format)UNIX类操作系统中普遍采用的目标文件格式 . 首先要知道它有什么作用:工具接口标准委员会TIS已经将ELF作为运行在Intel32位架 ...
- 《Linux内核分析》实践2
<Linux及安全>实践2 一.Linux基本内核模块 1.1什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一 ...
- LINUX第三次实践:程序破解
LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...
- linux,windows 可执行文件(ELF、PE)
现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format ...
随机推荐
- Effective Java 28 Use bounded wildcards to increase API flexibility
Get and Put Principle PECS stands for producer-extends(? extends T), consumer-super(? super T). For ...
- Effective Java 58 Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
Three kinds of throwables Throwables Checked Recoverable checked exceptions Y Y runtime exceptions N ...
- 好RESTful API的设计原则
说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间,如有人愿意转载请注明出处,谢谢^_^ P ...
- C/S架构程序多种类服务器之间实现单点登录(转)
(一) 在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆.好友下载.群下载.网络硬盘.QQ游戏.QQ音乐等,总不能要求用户每次输入用户名.密码吧,为解决这个问题,高手提 ...
- jdbc至sql server的两种常见方法
Statement和prepareStatement sql server中已建立BookPhone数据库,包含bookPhone表,eclipse中有BookPhone类,三个string类型的值 ...
- gdb 远程调试 android native 程序
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张原理图: 我是 Linux 和 Android 双料 0 基础,目前对 gdb 了解的很浅显.(注意 ...
- windows server 2003下安装.net framework 3.5 一直安装不成功
安装包是在微软下载中心下的197m的文件 重启了也是不行,最后 找到.net framework 3.5 sp1 一个237m的安装包 安装成功了! Congratulations !
- Git操作指令进阶
注意: 学习前请先配置好Git客户端 相关文章:Git客户端图文详解如何安装配置GitHub操作流程攻略 官方中文手册:http://git-scm.com/book/zh GIT 学习手册简介 本站 ...
- private成员变量真的私有吗?(用指针刨他祖坟)
今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢.于是做了这个实验.首先定义了一个类: class Test { private: int i; char c; int* p; public ...
- DB String Split sample
以sqlserver为例进行说明,代码稍加修改,可以用于ORACLE. 字符串的拆分和聚合是数据库开发人员比较常见的任务. 关于字符串的聚合和拆分,sqlserver的标准解决方案是for xml p ...