赞
踩
From:http://blog.csdn.net/yasi_xi/article/details/45197583
readelf命令:http://man.linuxde.net/readelf
ELF文件格式解析:https://www.2cto.com/kf/201605/511370.html
ELF文件格式解析:http://blog.csdn.net/earbao/article/details/51746275
可执行文件(ELF)格式的理解------系列文章:http://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html
Linux内核分析——ELF文件格式分析:http://www.cnblogs.com/20135223heweiqin/p/5554922.html
linux第三次实践:ELF文件格式分析:http://www.cnblogs.com/cdcode/p/5551649.html
程序破解及ELF文件格式分析:http://www.jianshu.com/p/7a75324e98ab
Android逆向之旅---SO(ELF)文件格式详解:https://blog.csdn.net/zhangmiaoping23/article/details/82314758
- #include <stdio.h>
- #include <stdlib.h>
-
- int main()
- {
- int a=100;
- printf("hello world!\n");
- return 0;
- }
输出结果说明
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC(Executable file)(.so文件DYN(Shared object file)、.o文件REL(Relocatable file)、Core dump文件(CORE))
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400510
Start of program headers: 64 (bytes into file)
Start of section headers: 3072 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 28
在 readelf 的输出中:
第 1 行,ELF Header: ELF 文件头开始。
第 2 行,Magic 魔数,用来指名该文件是一个 ELF 目标文件。
第一个字节 7F 是个固定的数;后面的 3 个字节正是 E, L, F 三个字母的 ASCII 形式。
第 3 行,CLASS 表示文件类型,这里是 64位的 ELF 格式。
第 4 行,Data 表示文件中的数据是按照什么格式组织(大端或小端)的,
不同处理器平台数据组织格式可能就不同,如x86平台为小端存储格式。
第 5 行,当前 ELF 文件头版本号,这里版本号为 1 。
第 6 行,OS/ABI ,指出操作系统类型,ABI 是 Application Binary Interface 的缩写。
第 7 行,ABI 版本号,当前为 0 。
第 8 行,Type 表示文件类型。ELF 文件有 3 种类型,
一种是如上所示的 Relocatable file 可重定位目标文件,
一种是可执行文件(Executable),
另外一种是共享库(Shared Library) 。
第 9 行,机器平台类型。
第 10 行,当前目标文件的版本号。
第 11 行,程序的虚拟地址入口点,因为这还不是可运行的程序,故而这里为零。
第 12 行,与 11 行同理,这个目标文件没有 Program Headers。
第 13 行,sections 头开始处,这里 208 是十进制,表示从地址偏移 0xD0 处开始。
第 14 行,是一个与处理器相关联的标志,x86 平台上该处为 0 。
第 15 行,ELF 文件头的字节数。
第 16 行,因为这个不是可执行程序,故此处大小为 0。
第 17 行,同理于第 16 行。
第 18 行,sections header 的大小,这里每个 section 头大小为 40 个字节。
第 19 行,一共有多少个 section 头,这里是 8 个。
第 20 行,section 头字符串表索引号,从 Section Headers 输出部分可以看到其内容的偏移
在 0xa0 处,从此处开始到0xcf 结束保存着各个 sections 的名字,
如 .data,.text,.bss等。
上述各段组成了最终在内存中执行的程序,其还提供了各段在虚拟地址空间和物理地址空间中的大小、位置、标志、访问授权和对齐方面的信息。各段语义如下:
读取 .o 文件
段 ( 也叫做 节 ,类比 竹子,一节一节 的)说明:
读取可执行文件
符号表保存了程序实现或使用的所有全局变量和函数,
如果程序引用一个自身代码未定义的符号,则称之为未定义符号,这类引用必须在静态链接期间用其他目标模块或库解决,或在加载时通过动态链接解决。
实现:
- typedef struct elf64_sym {
- Elf64_Word st_name; // 符号名称,字符串表中的索引
- STT_OBJECT表示符号关联到一个数据对象,如变量、数组或指针;
- STT_FUNC表示符号关联到一个函数;
- STT_NOTYPE表示符号类型未指定,用于未定义引用
- unsigned char st_info; // 类型和绑定属性:STB_LOCAL/STB_GLOBAL/STB_WEAK;
- unsigned char st_other; // 语义未定义,0
- Elf64_Half st_shndx; // 相关节的索引,符号将绑定到该节,此外SHN_ABS指定符号是绝对值,
- 不因重定位而改变,SHN_UNDEF标识未定义符号。
-
- Elf64_Addr st_value; // 符号的值
- Elf64_Xword st_size; // 符号的长度,如一个指针的长度或struct对象中包含的字节数。
- } Elf64_Sym;
readelf 用来显示 ELF 格式文件信息,该命令选项很多,其中 -a 选项可以用来显示 ELF 文件的所有信息。
下面对 -a 选项的输出内容进行分析。源码如下:
进行 gcc 编译,等操作:
例如:我想解析出我在 test.c 文件中写的全局变量的内容。可以查看 符号表( Symbol table '.dynsym')部分
其中字段中有 OBJECT 和 GLOBAL 的即为全局变量,我们在 test.c 中定义的全局变量会出现在里面,如上图中 244 和 252 行。
以及一些函数等内容都可以在这段区域内找到相应的地址和大小信息等。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。